为何exec(f"module.{function}")返回NoneType而非执行目标函数?
问题分析与解决
首先明确核心事实:exec本身不会返回执行代码产生的返回值,它仅负责执行传入的代码字符串——无论你用f-string拼接还是直接写死字符串,exec的返回值都是None,这是exec的特性,和f-string无关。
你觉得exec("flscript.Number('hp',100)")“正常执行”,其实只是函数被调用了,但返回的字典根本没被保存下来;而用f-string拼接时,你同样只是执行了函数调用,没把结果赋值给变量,自然拿不到预期的字典。
正确解决方法
你需要在exec执行的代码字符串里完成赋值操作,把函数返回的字典绑定到一个变量上,之后再从作用域中获取这个变量:
# 假设你的value是"Number('hp',100)" value = "Number('hp',100)" # 构造包含赋值逻辑的代码字符串 exec(f"health = flscript.{value}") # 现在可以直接使用health变量 print(health)
如果不想污染全局作用域,还可以通过exec的locals参数单独接收结果:
value = "Number('hp',100)" local_scope = {} exec(f"result = flscript.{value}", globals(), local_scope) health = local_scope['result'] print(health)
总结
exec完全支持f-string拼接,你的问题和f-string无关exec不返回执行代码的结果,必须在执行的代码里主动把结果赋值给变量- 把赋值逻辑写进
exec的代码字符串,是获取函数返回值的唯一方式
内容的提问来源于stack exchange,提问作者rezarg
相关产品推荐
相关产品推荐

