Словарь YAML для Python с правильными типами данных, использующими только встроенную функциональность

#python #python-3.x #dictionary

#python #python-3.x #словарь

Вопрос:

У меня есть переменная, содержащая 4 строки ключа / значений YAML, которая используется в качестве основного элемента в файле Markdown.

Мне нужно поместить его в словарь, но когда я делаю это, я хочу date: , чтобы значение стало объектом datetime, а tags: значения стали списком.

Я не уверен, как это сделать. Я могу поместить ключ / значения в словарь, но я не уверен, как приступить к «преобразованию» date: и tags: к правильным типам до или во время создания словаря.

Вот как я сейчас делаю это без правильных типов:

 >>> import re
>>> frontmatter = """
... id: 20201222163206
... title: Lorem Ipsum Dolor Sit Amet
... date: 2020-12-22 16:32:06
... tags: [lorem, ipsum, dolor, sit, amet]
... """
>>> frontmatter_dict = dict(re.findall(r"(.*): (.*)", frontmatter))
>>> print(frontmatter_dict)
{'id': '20201222163206', 'title': 'Lorem Ipsum Dolor Sit Amet', 'date': '2020-12-22 16:32:06', 'tags': '[lorem, ipsum, dolor, sit, amet]'}
 

Это то, что я хочу, чтобы словарь был структурирован так (с правильными типами, как указано выше):

 {'id': 20201222163206, 'title': 'Lorem Ipsum Dolor Sit Amet', 'date': datetime.datetime(2020, 12, 22, 16, 32, 6), 'tags': ['lorem', 'ipsum', 'dolor', 'sit', 'amet']}
 

Я могу выполнить это в приведенном выше примере, используя модуль PyYAML, но очень важно, чтобы я использовал для этого только встроенные модули Python, поэтому использование PyYAML в данном случае не является решением.

Я просмотрел исходный код PyYAML, чтобы посмотреть, смогу ли я понять, как это сделать, но, увы, мои навыки Python еще недостаточно хороши, чтобы понять это.

Как уже упоминалось, именно так я выполняю это с помощью PyYAML, но мне нужно делать это только со встроенными модулями.

 >>> import yaml
>>> frontmatter = """
... id: 20201222163206
... title: Lorem Ipsum Dolor Sit Amet
... date: 2020-12-22 16:32:06
... tags: [lorem, ipsum, dolor, sit, amet]
... """
>>> frontmatter_dict = yaml.load(frontmatter, Loader=yaml.FullLoader)
>>> print(frontmatter_dict)
{'id': 20201222163206, 'title': 'Lorem Ipsum Dolor Sit Amet', 'date': datetime.datetime(2020, 12, 22, 16, 32, 6), 'tags': ['lorem', 'ipsum', 'dolor', 'sit', 'amet']}
 

Комментарии:

1. В стандартной библиотеке Python нет синтаксического анализатора YAML, попытка реализовать его с помощью регулярных выражений — не лучшая идея.

2. Почему «важно», чтобы вы не использовали библиотеку синтаксического анализа YAML для анализа YAML?

3. Но в любом случае, у вас, похоже, уже решена часть «синтаксического анализа YAML». Теперь вам просто нужно преобразовать id в целое число, date в дату и tags в список. В чем была проблема с этим?

Ответ №1:

после построения словаря

 import datetime


frontmatter_dict['date'] = datetime.datetime.strptime(frontmatter_dict['date'], '%Y-%m-%d %H:%M:%S')
 

для тега

 frontmatter_dict['tag'] = frontmatter_dict['tag'][1:-1].split(',')