【问题标题】:Ternary expression in string in a dictionary字典中字符串中的三元表达式
【发布时间】:2018-09-05 08:01:21
【问题描述】:

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

【问题讨论】:

  • 想要达到什么目的?几乎可以肯定有更好的方法。请参阅 XYhere

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


【解决方案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”,只有在确实需要时才应该这样做。

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 2015-02-08
    • 2018-05-23
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2011-10-14
    • 2022-01-22
    相关资源
    最近更新 更多