Выполнение арифметической операции в 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']), но избавляет вас от необходимости явно обрабатывать его в вашей программе.