如下是对yaml解析器的高级封装,使用了面向对象的思想。
demo.yml文件中的内容:
test:
a:
b: dashuai
封装代码
import yaml
class YamlOperation(dict):
def __init__(self, file_path=None, content=None):
super().__init__()
if file_path is not None:
with open(file_path, "r")as file:
content = yaml.load(file, Loader=yaml.SafeLoader)
content = content if content is not None else {}
# content = [content, {}][not content]
# content = (not content and content or {})
for key, value in content.items():
if isinstance(value, dict):
self[key] = YamlOperation(content=value)
else:
self[key] = value
def __getattr__(self, key):
"""访问不存在的属性key时返回None"""
return None
def __setattr__(self, key, value):
"""设置实例属性值"""
self[key] = value
def __setitem__(self, key, value):
"""给self[key]赋值"""
super().__setattr__(key, value)
super().__setitem__(key, value)
def __missing__(self, key):
"""访问的键key不存在时,返回None"""
return None
if __name__ == '__main__':
data = YamlOperation("demo.yml")
print(data.test) # 输出:{'a': {'b': 'dashuai'}}
print(data['test']) # 输出:{'a': {'b': 'dashuai'}}
print(data.get('test')) # 输出:{'a': {'b': 'dashuai'}}
print(data.test.a.b) # 输出:dashuai
print(data.a) # 调用__getattr__ 返回None
print(data['a']) # 调用__missing__ 返回None
说明:代码中定义了YamlOperation类,继承了dict字典,并重写了几个带__的魔法方法。魔法方法的使用参考:python魔法方法、内置方法详解,实例化类的对象后,可以用.属性的方式访问。