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