2014-03-31 49 views

回答

1
def my_yaml_dump(yaml_obj): 
    my_ob = deepcopy(yaml_obj) 
    for item in dir(my_ob): 
     if item.startswith("_") and not item.startswith("__"): 
      del my_ob.__dict__[item] 
    return yaml.dump(my_ob) 

這樣的事情會忽略與單個(領先)任何下劃線

我想這是你想要的

class Trivial(yaml.YAMLObject): 
    yaml_tag = u'!Trivial' 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self._ignore = 3 
    @classmethod 
    def to_yaml(cls, dumper, data): 
     # ... 
     my_ob = deepcopy(data) 
     for item in dir(my_ob): 
      if item.startswith("_") and not item.startswith("__"): 
       del my_ob.__dict__[item] 
     return dumper.represent_yaml_object(cls.yaml_tag, my_ob, cls, 
               flow_style=cls.yaml_flow_style) 

雖然一個更好的會面明確HOD(文體)

class SecretYamlObject(yaml.YAMLObject): 
    hidden_fields = [] 
    @classmethod 
    def to_yaml(cls,dumper,data): 
     new_data = deepcopy(data) 
     for item in cls.hidden_fields: 
      del new_data.__dict__[item] 
     return dumper.represent_yaml_object(cls.yaml_tag, new_data, cls, 
              flow_style=cls.yaml_flow_style) 

class Trivial(SecretYamlObject): 
    hidden_fields = ["_ignore"] 
    yaml_tag = u'!Trivial' 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self._ignore = 3 

print yaml.dump(Trivial()) 

這是秉承蟒蛇的口頭禪是比隱

+0

更好,如果你能以這樣的方式,一個標準的'yaml.dump(T)'會做「的編輯此正確的事情',我會感激'')'我相信這將是['YAMLObject.to_yaml'](http://pyyaml.org/wiki/PYYAMLDocumentation#YAMLObject)的定製,但我不確定如何重新定義它。 (不幸的是,沒有給出任何示例,並且我不太熟悉序列化作爲練習。) –

+0

我認爲我的編輯可以解決您的問題 –

+0

作爲一邊爲什麼你使用yaml?我認爲它比很多其他方式來序列化數據更少見... –

相關問題