Строка обрабатывается как переменная в операторе `eval` - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь сделать предельно простую передачу строковой переменной в мой оператор eval. Однако моя строка обрабатывается как неопределенная переменная.

Вот мой код:

condition = 'hi'
print(eval("2 + 4 * len(%s)" % (condition)))

Выход:

Traceback (most recent call last):
  File "C:\test.py", line 3, in <module>
    print(eval("4 + 3 * len(%s)" % (condition)))
  File "<string>", line 1, in <module>
NameError: name 'hi' is not defined

Однако, когда я определяю hi как переменную, код внезапно компилируется и запускается:

condition = 'hi'
hi = 'hi'
print(eval("2 + 4 * len(%s)" % (condition)))

Выход:

10

Что в мире? Это кажется совершенно не интуитивным для меня. Может ли кто-нибудь помочь мне определить condition таким образом, чтобы Python не запрашивал также определение 'hi'?

Ответы [ 4 ]

1 голос
/ 07 апреля 2019

Этот% s будет заменен на hi. Итак, вы просите Python запустить код:

eval("2 + 4 * len(hi)")

len(hi) будет искать переменную с именем "hi". То, что вы хотите, это len('hi') или len(condition). Вот несколько альтернатив, которые должны работать:

# Simplest
print(eval("2 + 4 * len(condition)"))

# Repr gives you the string representation of the object, including quotes
print(eval("2 + 4 * len(%s)" % (repr(condition))))

# Assuming condition doesn't contain '
print(eval("2 + 4 * len('%s')" % (condition))) 
0 голосов
/ 07 апреля 2019

Вам нужны кавычки около% s, вот так:

condition = 'hi'
print(eval("2 + 4 * len('%s')" % (condition)))

Таким образом, вы передаете len () строку 'hi' вместо переменной hi.

0 голосов
/ 07 апреля 2019

вы не передаете hi как строку

>>> condition = "'hi'"
>>> print(eval("2 + 4 * len(%s)" % (condition)))
10
0 голосов
/ 07 апреля 2019

Обычно вы заменяете% s на 'hi'.

Попытка выполнения len (hi) приведет к тому же исключению NameError, что и hi не определено.

print(eval("2 + 4 * len(\"%s\")" % condition))

будет делатьработа. Скриншот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...