字典中字符串中的三元表达式

Ternary expression in string in a dictionary

如何计算这个三元表达式而不引发任何错误?当我 运行 这个没有字符串和 eval() 时,它工作得很好,直到我尝试 运行 使用字符串和 eval().

c = {1: "y += 1 if y == 1 else print('F')",
    2: "y -= 1 if y == 2 else print('F')",
    3: "x += 1 if x == 1 else print('F')",
    4: "x -= 1 if x == 2 else print('F')"}

for i in range(1,5):
    eval(c[i])

错误回溯:

Traceback (most recent call last):
  File "C:/Users/.../mazefinder.py", line 25, in <module>
    eval(c[i])
  File "<string>", line 1
    y += 1 if y == 1 else print('F')
       ^
SyntaxError: invalid syntax

我希望此代码递增或递减 x 或 y!

您正在向需要表达式的 "eval" 函数提供 "statement"。给 var 赋值是 "statement"。因此,如果您提供表达式而不是语句,它不会引发错误。

假设您确实需要使用 "eval",那么您可以执行以下操作:

x = 1
x += eval("1 if x == 1 else 0") # a statement is outside of an expression
x += eval("-1 if x == 2 else 0")
y += eval("1 if y == 1 else 0")
y += eval("-1 if y == 2 else 0")

我们更改值而不是运算符,因此我们能够将语句移出 "eval",使两个条件结果相同。

但是,即使不考虑 "SyntaxError" 错误,在条件的 "False" 结果的情况下,您自己的示例中也会出现 "TypeError" 错误,因为 "print" 函数returns "None".

然后,你会遇到更多的问题和反模式,例如:

  • "iterating" 在您的示例中根本不需要按索引。
  • "dict" 是此处使用的错误对象类型,因为您的示例只需要值而不注意键。
  • 您执行了多余的操作,例如将一个条件分离为多个单独的条件。
  • 完全不清楚是否需要使用"eval",只有真正需要时才应该使用。