【问题标题】:What is recommended coding style for conditional operator in Python?Python中条件运算符的推荐编码风格是什么?
【发布时间】:2015-08-13 12:12:19
【问题描述】:

以下行是我的代码的一部分。我可能是错的,但它似乎对我来说足够pythonic。但是,乍一看,尚不清楚它的确切含义。是否有更好的代码布局可以使其更清晰? _idName 是一个函数或 DataFrame

while  id1!="cancel" and ((id1 not in _idName.id.values) 
        if isinstance(_idName,_pd.DataFrame) else (_idName(id1) is None)):
    do something with the variables evaluated in the condition

【问题讨论】:

  • 你的代码当前不是正确的python语法
  • @muddyfish 是的!
  • if 之前的换行符令人困惑。最好的解决办法可能是使用一些中间变量或重组,以便代码的作用一目了然。
  • @muddyfish 粗略,只是你的版本不能被懒惰地评估
  • @bmello 不,这不是可取的 - 它会(尝试)评估 两个 id1 not in _idName.id.values_idName(id1) is None

标签: python coding-style indentation


【解决方案1】:

您的代码布局确实让人很不清楚发生了什么。

至少,我倾向于在二元运算符andor 之后换行,每个the style guide,而不是在单个条件的中间。

如果可能,我也会尝试在一行中保留一个三元组;但是,在这种情况下,最终会很长,因此可能不是一个选择。我认为三元中的布尔运算符在行首更有意义,尽管我找不到这方面的参考("Martijn likes it too" 之外)。

一个更易读的例子:

while (id1 != "cancel" and 
       ((id1 not in _idName.id.values) if isinstance(_idName, _pd.DataFrame) 
        else (_idName(id1) is None))):

或许:

while (id1 != "cancel" and 
       ((id1 not in _idName.id.values)
        if isinstance(_idName,_pd.DataFrame)
        else (_idName(id1) is None)):

【讨论】:

  • 我的表达其实不等价,哎呀。
  • @poke 的建议确实很聪明。但是,我认为条件运算符更清楚地表明,只有第二个子句中的一个被评估,具体取决于条件的值。
  • 不,不幸的是,parens 没有做任何事情(因为这是正常的操作顺序)。当A 为真且B 为假时出现问题;在这种情况下,不应评估 C(因为 A 为真)。
  • 你写的是@poke,它们不等价。如果 A 为真且 B 为假,则应返回 False,并且永远不应评估 C。
【解决方案2】:

创建一个为您进行检查的小函数,然后在 while 语句中使用它。

def check_whatever(id1, _idName):
    if id1 == 'cancel':
        return False

    if isinstance(_idName,_pd.DataFrame):
        return id1 not in _idName.id.values:
    else:
        return _idName(id1) is None


while check_whatever(id1, _idName):
    do_stuff()

【讨论】:

  • 您可以使用例如return id1 not in _idName.id.values 来简化它
  • 我不确定这是否更简单;它只是将最后一次检查与回退合并。这更容易理解 IMO(尽管它可能更容易)。
  • 我们的工作有点盲目,因为我们不知道这一切背后的语义学。
  • 它可以让你把六行变成三行:if isinstance(_idName, _pd.DataFrame): return id1 not in _idName.id.values; return _idName(id1) is None 在逻辑上是等价的。
  • 是的,我刚刚意识到,当我在评论语义时;很晚了:)。
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
相关资源
最近更新 更多