Оценочная переменная содержит математическое выражение в f-строках - PullRequest
0 голосов
/ 07 мая 2018

Я должен принять ввод (используя raw_input()) в качестве выражения мощности, например 10**5, а затем распечатать его значение. Я пробовал несколько кусков кода, но они не дают желаемых результатов:

print(f'{2**4}') #<-- prints 16 correctly
a = '{2**4}'
print(f'{{}}'.format(a)) #<-- prints {2**4}

Можно ли достичь чего-то вроде:

var = '2**4'
print(f'{<some way to expand var in here>}') #<-- prints 16

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

В f-строках выражения анализируются с эквивалентом:

ast.parse('(' + expression + ')', '<fstring>', 'eval')

см. https://docs.python.org/3/library/ast.html#ast.parse

Но переменные будут заменены их фактическим значением. То, что вы ищете, это своего рода вложенная оценка, которая не поддерживается f-строками. Вместо этого, в качестве безопасного подхода, вы можете сначала разделить с помощью «**», затем преобразовать в int и, наконец, использовать power:

In [9]: s = "2**4"

In [10]: print(f"{pow(*map(int, s.split('**')))}")
16
0 голосов
/ 07 мая 2018

Так что это работает для всех выражений (например, ((2+4-10+88*2)/100)**5), но я не уверен, что это правильный путь (поскольку eval не рекомендуется)

a = '2**4'
print(eval (a))  #<-- prints 16
...