【发布时间】:2020-12-07 17:37:18
【问题描述】:
我有一个定义类和函数的模块:
#barbaz.py
class Bar:
pass
def baz():
return "hello"
在另一个模块中,我有一个带有 eval 语句的函数:
#foo.py (version 1)
def foo(baz: callable):
bazstr: str = baz.__name__
print(bazstr)
try:
f=eval(f'{bazstr}()')
print(f'result: {f}')
except Exception as e:
print(f"eval error: {e}")
最后,我在另一个模块中进行了测试:
#test.py
from evalf import foo
from barbaz import baz, Bar
#This works...
foo(baz)
#This doesn't
foo(Bar)
baz 有效,但 Bar 无效。我得到输出:
baz
result: hello
Bar
eval error: name 'Bar' is not defined
似乎eval 不能使用从模块中导入的类,除非它直接导入到与foo() 函数相同的模块中。即,这有效:
#foo.py (version 2)
from barbaz import Bar
def foo(baz: callable):
bazstr: str = baz.__name__
print(bazstr)
try:
f=eval(f'{bazstr}()')
print(f'result: {f}')
except Exception as e:
print(f"eval error: {e}")
foo(Bar)
为什么 foo.py 的第 2 版可以工作,而第 1 版会抛出显示的错误?
我怎样才能解决这个问题,并在它自己的模块中的 eval 语句中使用导入的类?
【问题讨论】:
标签: python python-3.x scope eval