如何初始化类的解析器/加载器/转储器



我想用以下参数初始化yaml

from ruamel.yaml import YAML
...
def null_representer(self, data):
return self.represent_scalar(u'tag:yaml.org,2002:null', u'null')
yaml = YAML()
yaml.representer.ignore_aliases = lambda *data: True
yaml.indent(mapping=2, sequence=4, offset=2)
yaml.preserve_quotes = True
yaml.representer.add_representer(type(None), null_representer)

我想知道是否有一种方法可以像这样初始化yaml以便在我的类中使用

class A:
def __init__(self):
self._yaml = (the yaml I initialized)

例如,python日志模块有这个函数-

import logging
def init_logging():
log = logging.getLogger()
log.setLevel(logging.INFO)
sh = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
sh.setFormatter(formatter)
log.addHandler(sh)
class A:
def __init__(self):
self._log = logging.getLogger('A')

如果您希望YAML()实例是您已经初始化的全局实例,并且类A在同一文件中的任何位置,您可以执行

def __init__(self):
self._yaml = yaml

只要在yaml被分配之前不创建A的实例。

如果在另一个文件中有A类,只需从Python文件中导入yaml,就像导入getLogger一样。例如,如果第一个代码块在myyaml.py中:

from util.myyaml import yaml

确保在子目录util

中有(一个空的)__init__.py

文件当然你也可以给A类一个实例它自己的YAML()实例:

from ruamel.yaml import YAML
def null_representer(self, data):
return self.represent_scalar(u'tag:yaml.org,2002:null', u'null')
class A:
def __init__(self):
self.yaml.load(.....)
@property
def yaml(self):
try:
return self._yaml
except AttributeError:
pass
self._yaml = yaml = YAML()
yaml.representer.ignore_aliases = lambda *data: True
yaml.indent(mapping=2, sequence=4, offset=2)
yaml.preserve_quotes = True
yaml.representer.add_representer(type(None), null_representer)
return yaml

这是我通常做事的方式。如果__init__()中没有使用self.yaml,则YAML()的实例化将延迟到您第一次使用它时,这可能会加快您的程序启动速度。

最新更新