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

时间:2018-03-27 03:34:01

标签: python-3.x syntax-error python-3.6 ternary-operator

如何在不引发任何错误的情况下评估此三元表达式?当我在没有字符串和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!

1 个答案:

答案 0 :(得分:1)

您正在为期望表达式的“eval”函数提供“声明”。为var分配值是一个“语句”。因此,如果您提供表达式,则不会引发错误,但不会声明。

让我们考虑您确实需要使用“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”函数返回“None”。

然后,你有更多的问题和反模式,如:

  • 在您的示例中根本不需要按索引“迭代”。
  • “dict”是在这里使用的错误对象类型,因为您的示例只需要不关注键的值。
  • 您执行冗余操作,例如将一个条件分成几个单独的条件。
  • 完全不清楚是否需要使用“eval”,只有在您真正需要时才应该这样做。