Python:条件表达式中的替换表达式

Python:条件表达式中的替换表达式,python,python-3.x,Python,Python 3.x,我可以这样做: ["val1" if some_method() == True else "val2" if some_method() == False else "val3"] [with some_method() as m: "val1" if m == True else "val2" if m == False else "val3

我可以这样做:

["val1" if some_method() == True
    else "val2" if some_method() == False
    else "val3"]
[with some_method() as m:
    "val1" if m == True
    else "val2" if m == False
    else "val3"]
这是可行的,但是我必须多次调用某些_方法。当然,我可以这样做:

m = some_method()
["val1" if m == True
    else "val2" if m == False
    else "val3"]
但是现在我已经声明了代码的其余部分。 有更好的方法吗?我在想这样的事情:

["val1" if some_method() == True
    else "val2" if some_method() == False
    else "val3"]
[with some_method() as m:
    "val1" if m == True
    else "val2" if m == False
    else "val3"]

Python本身不支持switch语句或let块,这两种语句都可以直接解决变量作用域问题。但是我们总是可以用lambdas来近似构造

[(lambda m: "val1" if m == True else "val2" if m == False else "val3")(some_method())]
但在这一点上,您可能想问问自己,是否最好将这段逻辑放入它自己恰当命名的函数中

def some_method_val():
  m = some_method()
  return "val1" if m == True else "val2" if m == False else "val3"

[some_method_val()]

那么m只在函数调用期间存在,而不是在整个程序中存在,如果选择得当,函数名可以作为方便的文档,说明为什么要使用布尔函数执行此分派操作。

Python本身不支持switch语句或let块,这两种方法都可以直接解决变量作用域问题。但是我们总是可以用lambdas来近似构造

[(lambda m: "val1" if m == True else "val2" if m == False else "val3")(some_method())]
但在这一点上,您可能想问问自己,是否最好将这段逻辑放入它自己恰当命名的函数中

def some_method_val():
  m = some_method()
  return "val1" if m == True else "val2" if m == False else "val3"

[some_method_val()]
那么m只在函数调用期间存在,而不是在整个程序中存在,如果选择得当,函数名可以作为方便的文档,说明为什么要使用布尔函数执行此分派操作。

:

或者如果方法的结果是可散列的:

[{True: "val1", False: "val2"}.get(some_method(), "val3")]
:

或者如果方法的结果是可散列的:

[{True: "val1", False: "val2"}.get(some_method(), "val3")]

布尔的全部意义在于它们有两种状态——对或错。在第三种甚至更多的状态中混合会破坏布尔逻辑的观点。这些if表达式很难编写,这不应该激励你给它们添加更多的逻辑,而是采取一种完全不同的方法。这不是我想要做的。真/假应该是一个简单的例子来解释我想做什么。很抱歉搞混了。布尔的全部意义在于它们有两种状态——真或假。在第三种甚至更多的状态中混合会破坏布尔逻辑的观点。这些if表达式很难编写,这不应该激励你给它们添加更多的逻辑,而是采取一种完全不同的方法。这不是我想要做的。真/假应该是一个简单的例子来解释我想做什么。很抱歉给你带来了困惑。