尝试在一个字符串中动态创建两个定义的函数。代码:
def main():
fns = '''
def plus_one(x):
return x + 1
def plus_two(x):
return plus_one(x) + 1
'''
exec(fns)
result = eval('plus_two(11)')
print(result)
if __name__ == '__main__':
main()
将此代码保存到名为dyn_code.py
的文件中并运行它会导致以下错误:
python dyn_code.py
Traceback (most recent call last):
File "dyn_code.py", line 19, in <module>
main()
File "dyn_code.py", line 14, in main
result = eval('plus_two(11)')
File "<string>", line 1, in <module>
File "<string>", line 7, in plus_two
NameError: name 'plus_one' is not defined
这里的问题是plus_one
无法在plus_two
内部解决。你知道吗
plus_one
本身在这里很好,可以用正确的结果调用。你知道吗
有谁能告诉我如何将这样的代码注入本地名称空间吗?具体来说,我想创建两个函数,其中一个引用另一个。你知道吗
我有意使用了exec
和eval
的最开放形式,我知道如何限制它们,等等。我还验证了调用exec
后,这两个函数都存在于本地命名空间中。你知道吗
更令人沮丧的是,代码在解释器会话中运行良好!也就是说,在通过exec
将这两个函数注入解释器名称空间之后,plus_two
运行时没有任何问题。你知道吗
理想情况下,我希望避免在函数场景中使用函数
def plus_two(x):
def plus_one(x):
return x + 1
return plus_one(x) + 1
这项技术实际上是可行的,但我需要两个显式命名的独立函数。
需要在对exec()
的调用中添加globals()
字典。您也可以省略对plus\u two的eval调用,如下所示:
def main():
exec('def plus_one(x):\n return x + 1\n\ndef plus_two(x): return plus_one(x) + 1', globals())
print(plus_two(11))
if __name__ == '__main__':
main()
扫描二维码关注公众号,回复:
17029009 查看本文章