在 Python 中动态创建函数 -- f(2) 无法解析 (f1)
Creating functions dynamically in Python -- f(2) cannot resolve (f1)
我正在尝试动态创建在一个字符串中定义的 2 个函数。代码:
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
本身在这里很好,可以用正确的结果调用。
任何人都可以告诉我如何将这样的代码注入本地名称空间吗?具体来说,我想创建 2 个函数,一个引用另一个。
我有意使用了 exec
和 eval
最开放的形式,我知道如何限制它们,等等。我还验证了在调用 exec
这两个函数都存在于本地命名空间中。
更令人沮丧的是代码在解释器会话中运行良好!也就是说,在通过 exec
将这两个函数注入到解释器命名空间后,plus_two
运行没有任何问题。
理想情况下,我想避免函数中函数的情况,即
def plus_two(x):
def plus_one(x):
return x + 1
return plus_one(x) + 1
这项技术确实有效,但我想要 2 个明确命名的独立函数。
函数的缩进 fns
很重要!并且您必须传递 globals()
映射的可选参数!
def main():
fns = '''def plus_one(x):
return x + 1
def plus_two(x):
return plus_one(x) + 1
'''
exec(fns,globals())
result = eval('plus_two(11)')
print(result)
if __name__ == '__main__':
main()
输出:
13
希望对您有所帮助!
您需要在对 exec()
的调用中添加 globals()
词典。您还可以省略 plus_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()
我正在尝试动态创建在一个字符串中定义的 2 个函数。代码:
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
本身在这里很好,可以用正确的结果调用。
任何人都可以告诉我如何将这样的代码注入本地名称空间吗?具体来说,我想创建 2 个函数,一个引用另一个。
我有意使用了 exec
和 eval
最开放的形式,我知道如何限制它们,等等。我还验证了在调用 exec
这两个函数都存在于本地命名空间中。
更令人沮丧的是代码在解释器会话中运行良好!也就是说,在通过 exec
将这两个函数注入到解释器命名空间后,plus_two
运行没有任何问题。
理想情况下,我想避免函数中函数的情况,即
def plus_two(x):
def plus_one(x):
return x + 1
return plus_one(x) + 1
这项技术确实有效,但我想要 2 个明确命名的独立函数。
函数的缩进 fns
很重要!并且您必须传递 globals()
映射的可选参数!
def main():
fns = '''def plus_one(x):
return x + 1
def plus_two(x):
return plus_one(x) + 1
'''
exec(fns,globals())
result = eval('plus_two(11)')
print(result)
if __name__ == '__main__':
main()
输出:
13
希望对您有所帮助!
您需要在对 exec()
的调用中添加 globals()
词典。您还可以省略 plus_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()