initializing yaml module in __init__.py

Обновить

April 2019

Просмотры

377 раз

1

Я использую PyYAML, и хотел бы иметь возможность использовать строковые конкатенации конструктора в моих .yaml файлов.

Это сообщение показывает , как добавить такие конструкторы 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)

Вышеуказанные работы , когда я ввожу его в питон терминале. Тем не менее, я хочу поставить выше в 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?

1 ответы

1

Your loading the module yaml from the file:

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

You either named one of your own files yaml.py, or you did have that file before and renamed it, but forgot to remove the yaml.pyc. So you are not loading the PyYAML interpreter with import yaml.

The easiest way to verify is to include a temporary line after the import:

import yaml
print(yaml.__file__)

you should see something like .../site-packages/yaml/__init__.pyc.