Выполнение арифметической операции в YAML?
Иногда мне приходится указывать время (в секундах) в файле конфигурации, и это довольно раздражает, чтобы написать точное количество секунд - вместо этого я хотел бы выполнить арифметику, чтобы я мог использовать:
some_time: 1 * 24 * 60 * 60
вместо точного:
some_time: 86400
К сожалению, при использовании этой строки: some_time: 1 * 24 * 60 * 60
, он будет рассматривать эту строку конфигурации как строку. Конечно, я могу использовать - eval(config['some_time'])
, но мне интересно, можно ли выполнять арифметику в YAML?
Ответы
Ответ 1
Я не думаю, что есть. По крайней мере, не по спецификации (http://yaml.org/spec/1.2/spec.html). Люди добавляют неофициальные теги к yaml (и wikipedia, кажется, говорит, что предложение для тега доходности, хотя они не говорят, кто предложил или где: http://en.wikipedia.org/wiki/YAML#cite_note-16), но ничего подобного вам не кажется доступным в pyyaml.
Глядя на специфические теги pyyaml, похоже, ничего интересного. Хотя !!timestamp '2014-08-26'
может быть удобно в некоторых ваших сценариях (http://pyyaml.org/wiki/PythonTagScheme).
Ответ 2
Это может быть достигнуто с помощью специфичных для Python тегов, предлагаемых PyYAML, то есть:
!!python/object/apply:eval [ 1 * 24 * 60 * 60 ]
Как показано ниже:
In [1]: import yaml
In [2]: yaml.load("!!python/object/apply:eval [ 1 * 24 * 60 * 60 ]")
Out[2]: 86400
Естественно, это то же самое, что выполнение eval(config['some_time'])
, но избавляет вас от необходимости явно обрабатывать его в вашей программе.