在 __init__.py 中初始化 yaml 模块

initializing yaml module in __init__.py

我正在使用 PyYAML,并希望能够在我的 .yaml 文件中使用字符串连接构造函数。

This post 显示如何将此类构造函数添加到 PyYAML:

import yaml

## define custom tag handler
def join(loader, node):
    seq = loader.construct_sequence(node)
    return ''.join([str(i) for i in seq])

## register the tag handler
yaml.add_constructor('!join', join)

当我在 python 终端中输入上面的内容时,它就起作用了。但是,我想将上面的内容放在 my_package__init__.py 文件中,这样我就可以:

from my_package import yaml  # my_package.__init__.py contains the above code

yaml.load("""
user_dir: &DIR /home/user
user_pics: !join [*DIR, /pics]
""")

但是,这会崩溃并显示以下消息:

AttributeError                            Traceback (most recent call last)
<ipython-input-1-1107dafdb1d2> in <module>()
----> 1 import simplelearn.yaml

/home/mkg/projects/simplelearn/simplelearn/__init__.py in <module>()
----> 1 import yaml
      2 
      3 def __join(loader, node):
      4     '''
      5     Concatenates a sequence of strings.

/home/mkg/projects/simplelearn/simplelearn/yaml.pyc in <module>()

AttributeError: 'module' object has no attribute 'add_constructor'

这是怎么回事?为什么 python 找不到 yaml.add_constructor

您正在从文件中加载模块 yaml

/home/mkg/projects/simplelearn/simplelearn/yaml.pyc

您将自己的文件之一命名为 yaml.py,或者您确实拥有该文件 之前并重命名它,但忘记删除 yaml.pyc。所以你没有用 import yaml.

加载 PyYAML 解释器

最简单的验证方法是在 import:

之后添加一个临时行
import yaml
print(yaml.__file__)

应该看到类似.../site-packages/yaml/__init__.pyc的内容。