这个python表达式意味着什么

时间:2012-02-21 02:52:28

标签: python operators logic

我在使用下面的逻辑时遇到了一些问题。我正在学习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))

对我而言,它总是会以真实结束。在讨论为什么代码不起作用时,讨论了这种差异:

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

“c和c == 2或True”与“c和c ==(2或True)”之间的逻辑是什么

我知道“==”比or更强大,但是我不明白整个构造试图做什么。它用于启用通配符。作为一个部分,我想我需要解释如何和数字的工作(我总是考虑它与真/假条件。

任何一个表达的“c和c”部分有什么意义?

谢谢,

Narnie

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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]

答案 2 :(得分:2)

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

无论是谁写的都可能想要not x or x==y这样的东西,但却没有达到目标。在今天的Python中,它会更清楚地表达为x==y if x else True