Что означает это выражение Python - PullRequest
2 голосов
/ 21 февраля 2012

У меня проблемы с логикой ниже.Я узнал о модуле 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 и c == 2 или True" против "c и c == (2или True) "

Я знаю, что" == "связывает сильнее, чем или, но я не понимаю, что пытается сделать вся конструкция.Он используется для включения подстановочного знака.Как часть, я думаю, что мне нужно объяснение того, как и как работает с числами (я всегда думал об этом в отношении условий True / False.

В чем смысл части "c и c" любого выражения?

Спасибо,

Нарни

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

На самом деле, я понял, что автор пытается сделать.

Автору нравится python, но он написан на языке Си.Он пытался смоделировать троичную операцию, как в:

bool ? true_value : false_value

Питонский способ сделать это не

c and c == d or True

, но использовать это как в Python 2.5 и выше

result = x if a > b else y

Если вы используете более низкую версию python, выполните:

result = (y, x)[a>b]
2 голосов
/ 21 февраля 2012

Я тоже не могу понять смысл этой конструкции. Как вы говорите, кажется, что это всегда будет True. Я думаю, что цель состояла в том, чтобы проверять совпадение только в том случае, если было установлено соответствующее поле, т. Е. Правда, но это не сработало.

Кто бы ни написал, что, вероятно, хотел что-то вроде not x or x==y, но не совсем понял. В сегодняшнем Python это будет более четко выражено как x==y if x else True.

2 голосов
/ 21 февраля 2012

orand) - оператор объединения ;он всегда возвращает один из своих операндов.

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