while循环无效语法

时间:2016-12-06 00:46:40

标签: python python-2.7 while-loop

我尝试使用此代码从字符串创建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

有一种替代方法可以正确执行此代码,但我想知道它为什么不起作用。 感谢。

2 个答案:

答案 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

有关evalexec之间差异的说明,请参阅this answer

您可能还有其他语法错误,但我不会尝试调试那么长的行。

此外,您应强烈重新考虑使用动态代码消费功能,例如evalexec。即使您的代码的预期用途不会带来任何安全风险,它们也会使调试和维护变得更加困难。他们无法避免的情况非常罕见。

答案 1 :(得分:0)

在发表评论之后,我意识到我真的很愚蠢,因为没有使用exec()代替eval(),因为一个给了我一个变量,另一个给了我一个变量。谢谢,Blorgbeard!