【问题标题】:What does this python expression mean这个python表达式是什么意思
【发布时间】:2012-02-21 02:52:27
【问题描述】:

我对下面的逻辑有一些问题。我正在学习 unittest 模块并遇到了这段代码。

def matches(self, date):

    return ((self.year and self.year == date.year or True) and
            (self.month and self.month == date.month or True) and
            (self.day and self.day == date.day or True) and
            (self.weekday and self.weekday == date.weekday() or True))

在我看来,它总是会以 True 结束。在讨论为什么代码不起作用时,讨论了这种差异:

>>> c=1
>>> c and c == 2 or True
True
>>> c and c == (2 or True)
False

“c and c == 2 or True”与“c and c == (2 or True)”的逻辑是什么

我知道“==”的绑定比 or 强,但我不明白整个构造试图做什么。它用于启用通配符。作为一部分,我想我需要解释如何处理数字以及如何处理数字(我一直认为它与真/假条件有关。

这两个表达式的“c 和 c”部分的意义何在?

谢谢,

纳尼

【问题讨论】:

  • 这看起来像非常可怕的代码 TBH。你从哪里弄来的?

标签: python operators logic


【解决方案1】:

or(和and)是一个合并操作符;它总是返回它的一个操作数。

>>> 1 or False
1
>>> 1 or True
1
>>> 0 or False
False
>>> 0 or True
True
>>> 0 or 'a'
'a'

【讨论】:

  • 然而,有时在代码中,数字会是一年,比如 2004。2004 和 2004 == 2004 或 True 对我来说毫无意义。由于最后一个“或 True”,它总是以 True 结束,并导致单元测试失败。我理解 0 和 1 因为 0 == False 和 1 == True。
  • 非零数字被认为是真实的。
【解决方案2】:

其实我已经猜到作者想要做什么了。

作者喜欢python,但是有C背景。他试图模拟一个三元运算,如下所示:

bool ? true_value : false_value

这样做的pythonic方式不是

c and c == d or True

东西,但要在 python 2.5 及更高版本中使用它:

result = x if a > b else y

如果使用较低版本的python,请执行以下操作:

result = (y, x)[a>b]

【讨论】:

  • 确实——在 Python 2.5 之前,当引入 Python 的内联“if”时,我看到人们推荐像上面这样的代码(而不是像在最后一个例子)
  • 请注意,如果 x 本身的计算结果为 False,则 x and expr or y 的执行方式可能会失败,而且很难找到方法
【解决方案3】:

我也无法真正理解这种结构。正如你所说,它似乎永远是True。我认为目的是仅在设置了相应的字段时才检查匹配,即真实,但这并没有这样做。

写这篇文章的人可能想要not x or x==y 之类的东西,但没有完全做到。在今天的 Python 中,它会更清楚地表达为x==y if x else True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2020-10-23
    • 2012-05-07
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多