使用exec赋值字符串变量触发SyntaxError的问题求助
问题解答
推测准确性
你的推测完全准确,exec执行时确实是对字符串值的解析出现混淆,进而触发语法错误。
原理说明
exec()的作用是执行合法的Python代码字符串。当你构造出Introduction0=What is your Department?这类代码字符串时,Python解析器会把等号右侧的内容当作表达式处理:
- 其中
is是Python的关键字,不能作为标识符的组成部分; - 字符串里的空格会被解析为多个语法单元的分隔符,Python会尝试将
What、is、your、Department?当作独立元素,但这种组合完全不符合Python语法规则,因此抛出SyntaxError。
本质问题是:如果不用引号包裹,exec会把等号右侧的内容视为Python代码的一部分(变量、关键字、表达式等),而非字符串字面量。
解决方法
需要给赋值右侧的字符串加上引号,让exec识别它是字符串字面量。最稳妥的方式是用repr()函数,它会自动为字符串添加合适的引号,还能处理字符串内部包含引号的情况:
修改后的核心代码:
for each_category in json_template: for index, each_question in enumerate(json_template[each_category]): left_side = each_category + str(index) right_side = each_question # 用repr()包裹右侧字符串,生成合法的赋值代码 bigstring = f'{left_side} = {repr(right_side)}' exec(bigstring) print(bigstring)
运行后,bigstring会变成类似Introduction0 = "What is your Department?"的合法代码,exec就能正确执行,将变量赋值为对应的字符串。
关于str(int)格式能运行的原因
当你把内容转为str(int)格式时,得到的是纯数字字符串(比如"123"),此时exec执行的代码类似Introduction0=123——右侧的123是合法的数字字面量,Python可以正常解析,因此不会报错。但这种方式仅适用于纯数字内容,无法保留原始的带空格和关键字的字符串。
内容的提问来源于stack exchange,提问作者BrianBeing
相关产品推荐
相关产品推荐

