You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用exec函数触发NameError问题求助

问题分析与解决方案

你的代码出现NameError: name 'CF' is not defined的原因很明确:当你用format把access_number的值替换到condition字符串里时,没有给这个值加上引号,导致exec把CF-12345当成了一个变量名,而不是字符串字面量。

举个例子,condition.format(v=access_number)执行后会生成这样的字符串:

str(CF-12345).startswith("CF-", 0)

Python看到CF-12345时,会认为这是一个名为CF的变量减去12345,但你根本没定义过CF这个变量,所以就触发了报错。

解决方法1:给格式化变量添加引号

修改condition的定义,在{v}外层加上双引号,让替换后的值被识别为字符串字面量:

access_number = 'CF-12345'
condition = 'str("{v}").startswith("CF-", 0)'
# 定义空字典作为执行时的局部命名空间(你原代码里的r未定义)
local_namespace = {}
exec(condition.format(v=access_number), globals(), local_namespace)

# 如果需要获取执行结果,可以调整condition为赋值语句
# condition = 'check_result = str("{v}").startswith("CF-", 0)'
# exec(...)
# print(local_namespace['check_result'])  # 会输出True

解决方法2:传递变量到exec的命名空间(更推荐)

直接把access_number作为变量传入exec的局部命名空间,避免手动拼接字符串的麻烦,同时也更安全(降低代码注入风险):

access_number = 'CF-12345'
# 直接使用变量v,无需手动拼接字符串内容
condition = 'check_result = v.startswith("CF-", 0)'
# 定义局部命名空间,将需要的变量传进去
local_vars = {'v': access_number}
exec(condition, globals(), local_vars)
# 从局部命名空间中取出执行结果
print(local_vars['check_result'])  # 输出True

这个方法的优势在于:不需要担心变量值里包含引号会破坏字符串结构,代码可读性更高,也更符合Python的最佳实践。另外要注意,exec是功能强大但有风险的工具,如果处理的是用户输入的动态代码,一定要做好安全校验,避免潜在的安全问题。

内容的提问来源于stack exchange,提问作者Francesco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:13:42