Переменные типа Yaml в арифметических операциях - PullRequest
1 голос
/ 14 октября 2019

У меня есть следующий файл YAML:

somthing:
  a: &a_num 5 
  b: &b_num 32
  c: !!python/object/apply:eval [ 5 * 32] # works
  d: !!python/object/apply:eval [ *a_num * *a_num] # throws error

Ошибка:

ожидаемый буквенный или цифровой символ, но найден ''

ЧтоЯ попытался типизировать переменные для чисел с плавающей запятой:

c: !!python/object/apply:eval [ !!float *a * !!float *b]

, но это также не сработало

Как я могу выполнять арифметические операции с переменными?

1 Ответ

0 голосов
/ 14 октября 2019

Это не сработает без создания модифицированного загрузчика, альтернативы eval и / или переписывания вашего YAML.

Если вы попытаетесь загрузить, сбросьте это:

  c: [ 5 * 32]

вы увидите, что скаляр без кавычек эквивалентен:

  c: ['5 * 32']

, поэтому ваш вызов eval получает в качестве аргумента список из одной строки.

Ваш YAML долженбыть действительным, а ваше - нет, поэтому ваша программа никогда не вызовет eval во второй раз. Синтаксический анализ [ *a_num * *a_num] завершается неудачно, поскольку * в начале этого узла не позволяет анализировать скаляр без кавычек, поскольку вместо этого он распознается как псевдоним. Псевдоним анализируется (до пробела после a_num), а затем синтаксический анализатор ожидает запятую для следующего элемента списка или закрывающий ]. Он пытается снова проанализировать псевдоним, и если бы он мог, он все равно жаловался бы на запятую (попробуйте использовать [ *a_num *a_num], чтобы увидеть этот эффект, вы никогда не достигнете вызова eval).

Итаквам придется либо прибегнуть к собственной альтернативе eval, которая знает, как обрабатывать последовательность элементов ([*a_num, '*', *a_num]) в качестве аргумента (так как это должен быть допустимый YAML), либо в качестве альтернативы у вас есть такой альтернативный доступ к механизму привязки / псевдонимаи представить его с [ '*a_num * *a_num' ].

...