Можете да използвате метода eval(string)
, за да направите това.
Определение
eval(code, globals=None, locals=None)
Кодът е просто стандартен код на Python - това означава, че все още трябва да има правилен отстъп.
Глобалите могат да имат дефиниран персонализиран __builtins__
, който може да бъде полезен за целите на сигурността.
Пример
eval("print('Hello')")
Ще отпечата hello
на конзолата. Можете също така да посочите локални и глобални променливи, които кодът да използва:
eval("print('Hello, %s'%name)", {}, {'name':'person-b'})
Загриженост за сигурността
Внимавайте обаче. Всяко въвеждане от потребителя ще бъде изпълнено. Обмисли:
eval("import os;os.system('sudo rm -rf /')")
Има редица начини за това. Най-лесно е да направите нещо като:
eval("import os;...", {'os':None})
Което ще хвърли изключение, вместо да изтрие вашия твърд диск. Въпреки че вашата програма е десктоп, това може да е проблем, ако хората преразпределят скриптове, което според мен е предназначено.
Странен пример
Ето един пример за използване на eval
доста странно:
def hello() : print('Hello')
def world() : print('world')
CURRENT_MOOD = 'happy'
eval(get_code(), {'contrivedExample':__main__}, {'hi':hello}.update(locals()))
Това, което прави това на линията eval, е:
- Дава друго име на текущия модул (той става
contrivedExample
за скрипта). Потребителят може да се обади на contrivedExample.hello()
сега.)
- Той определя
hi
като сочещ към hello
- Той комбинира този речник със списъка на текущите глобални в изпълняващия модул.
НЕУСПЕХ
Оказва се (благодаря на коментаторите!), че всъщност трябва да използвате оператора exec
. Голямо опа. Ревизираните примери са както следва:
exec
Определение
(Това изглежда познато!) Exec е израз:
exec "code" [in scope]
Където scope е речник на локални и глобални променливи. Ако това не е посочено, то се изпълнява в текущия обхват.
Кодът е просто стандартен код на Python - това означава, че все още трябва да има правилен отстъп.
exec
Пример
exec "print('hello')"
Ще отпечата hello
на конзолата. Можете също така да посочите локални и глобални променливи, които кодът да използва:
eval "print('hello, '+name)" in {'name':'person-b'}
exec
Загриженост за сигурността
Внимавайте обаче. Всяко въвеждане от потребителя ще бъде изпълнено. Обмисли:
exec "import os;os.system('sudo rm -rf /')"
Печат на извлечение
Както също беше отбелязано от коментаторите, print
е израз във всички версии на Python преди 3.0. Във 2.6 поведението може да се промени чрез въвеждане на from __future__ import print_statement
. В противен случай използвайте:
print "hello"
Вместо :
print("hello")
person
Lucas Jones
schedule
18.06.2009