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
相关产品推荐
相关产品推荐

