我尝试使用此代码从字符串创建while循环,但它无法正常工作。这是我用eval()函数调用的字符串:
'while True:\n\vprint("What role do you want?")\n\vAnswer = Reformat(raw_input())\n\vif Answer in RoleArray:\n\v\vPlayArray[0].append(Answer)\n\vif Answer == "Mafia":\n\v\v\vMafia.append(User)\n\v\velif Answer == "Sheriff":\n\v\v\vSheriff = User\n\v\velif Answer == "Doctor":\n\v\v\vDoctor = User\n\v\vdel RoleArray[RoleArray.index(Answer)]\n\velse:\n\v\vprint("That is not a role. Please check you spelling. [Mafia/Sheriff/Doctor/Townsperson]")'
这是出现的错误:
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
eval('while True:\n\vprint("What role do you want?")\n\vAnswer = Reformat(raw_input())\n\vif Answer in RoleArray:\n\v\vPlayArray[0].append(Answer)\n\vif Answer == "Mafia":\n\v\v\vMafia.append(User)\n\v\velif Answer == "Sheriff":\n\v\v\vSheriff = User\n\v\velif Answer == "Doctor":\n\v\v\vDoctor = User\n\v\vdel RoleArray[RoleArray.index(Answer)]\n\velse:\n\v\vprint("That is not a role. Please check you s')
File "<string>", line 1
while True:
^
SyntaxError: invalid syntax
有一种替代方法可以正确执行此代码,但我想知道它为什么不起作用。 感谢。
答案 0 :(得分:2)
最可能的罪魁祸首是您使用\v
代替\t
标签和使用eval
。你需要修复两个:
修复两者都会删除语法错误:
>>> exec("while True:\n\tprint('yup')\n\tbreak")
yup
使用垂直制表符\v
会导致语法错误:
>>> exec("while True:\n\vprint('yup')\n\vbreak")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 2
♂print('yup')
^
SyntaxError: invalid syntax
使用eval
也是如此,它仅适用于表达式:
>>> eval("while True:\n\tprint('yup')\n\tbreak")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
while True:
^
SyntaxError: invalid syntax
有关eval
和exec
之间差异的说明,请参阅this answer。
您可能还有其他语法错误,但我不会尝试调试那么长的行。
此外,您应强烈重新考虑使用动态代码消费功能,例如eval
和exec
。即使您的代码的预期用途不会带来任何安全风险,它们也会使调试和维护变得更加困难。他们无法避免的情况非常罕见。
答案 1 :(得分:0)
在发表评论之后,我意识到我真的很愚蠢,因为没有使用exec()
代替eval()
,因为一个给了我一个变量,另一个给了我一个变量。谢谢,Blorgbeard!