в YAML с Python - как я могу определить типы в моей карте? - PullRequest
1 голос
/ 28 июня 2011

Я в тупике. вот что я хочу структурировать мои документы как:

release: JULY
files:
    # files
    /foo/config.py:       1.6
    /bar/dao.py:                1.19

Затем я хочу вернуть файлы в зависимости от версии, указанной в python. Эта часть проста, но она возвращает значения в виде значений с плавающей запятой, что создает проблему. Я хотел бы заставить их строки без предварительной обработки. (Я не хочу открывать файл, просматривать версии и добавлять !! python / str к каждой записи)

Я предполагаю, что теги - это способ сделать это, но я не могу сделать заголовки или хвосты документации с точки зрения того, как / где я могу определить тег.

Есть указатели?

Ответы [ 2 ]

0 голосов
/ 28 июня 2011

Похоже, что вы хотите сделать, это подкласс Loader и вызвать add_path_resolver, что-то вроде этого:

class MyLoader(yaml.Loader):
    pass
MyLoader.add_path_resolver(SOME_TAG, SOME_PATH, str)

f = open('foo.yaml')
the_data = yaml.load(f, Loader=MyLoader)

Но я не могу найти никакой документации по add_path_resolver и какими должны быть SOME_TAG и SOME_PATH.

0 голосов
/ 28 июня 2011

Вам не нужно указывать тип для строки, если вы хотите вывести значения float в виде строк, просто сначала вызовите str() для них:

>>> d = {'release': 'JULY', 'files': {'/path/file': str(1.6), '/path/file2': str(1.9)}}

>>> print yaml.dump(d, default_flow_style=False)
files:
  /path/file: '1.6'
  /path/file2: '1.9'
release: JULY

Если вы хотите сериализовать / десериализовать пользовательские объекты, вы можете сделать это до некоторой степени, просто определив __repr__ в своем классе:

class Foo:
    def __init__(self, x):
        self.x = x
    def __repr__(self):
        return "%s(%r)" % (self.__class__.__name__, self.x)

>>> f = Foo(0)
>>> foo = yaml.dump(f)
>>> yaml.load(foo)
<<< Foo(0)
...