2017-02-19 2 views
1

Я делаю задание составить подмножество Паскаля и в исходной программе есть строка кода, как это:Почему следующий код возвращает True?

if x.tp == y.tp in {Bool, Int}: 
    some other code ... 

Это делает меня действительно путают, как x.tp == y.tp возвращает логическое значение True или False и таким образом True/False in {Bool, Int} всегда будет возвращаться False.

Определение Bool и Int является следующее:

class Int: pass 

class Bool: pass 

Затем я поставил точку останова на этой линии, и поиграйте в отладчике VSCode в:

>> x.tp 
<class 'ST.Int'> 
>> y.tp 
<class 'ST.Int'> 
>> x.tp == y.tp 
True 
>> a = (x.tp == y.tp) 
None 
>> a 
True 
>> a in {Bool, Int} 
False 
>> x.tp == y.tp in {Bool, Int} 
True  <----------------------- why does it return True? 

Почему x.tp == y.tp in {Bool, Int} возвращение True Вот?

+0

Что такое 'x.tp' и' y.tp'? –

+0

@ JimFasarakis-Hilliard 'x.tp' и' y.tp' - оба типа. Я не уверен, что я должен опубликовать больше кода, поскольку он слишком длинный. –

ответ

4

Используйте круглые скобки для группы сравнения равенства:

if (x.tp == y.tp) in {Bool, Int}: 

Вашего приковано сравнение получает оцененное на Python как:

if x.tp == y.tp and y.tp in {Bool, Int}: 

, который дает True так y.tp является класса <class 'ST.Int'> и фактически в tha т.

От Reference Manual on Comparisons:

Сравнения могут быть соединены произвольно, например, x < y <= z эквивалентно x < y and y <= z, за исключением того, что y вычисляется только один раз (но в обоих случаях z не оцениваются на всех, когда x < y найден False).

+0

Это не имеет значения, так как == и имеет тот же приоритет и будет оцениваться слева направо, не так ли? –

+0

@Jackddddd '==' получает оценку, 'y.tp в {Bool, Int}' также получает оценку хотя (поскольку равенство является 'True') и делает все« правдой », вот как Python имеет дело с сопоставленными сравнениями , –

0

Естественно, мы из предположения, что эта строка кода

if x.tp == y.tp in {Bool, Int}: 

должен работать (или разобранный), как:

if (x.tp == y.tp) in {Bool, Int}: 

Но это не дело. Согласно this article, синтаксический анализ, а затем сравнение делается так:

if (x.tp == y.tp) and (y.tp in {Bool, Int}) : 

Там что-то запутанным происходит из-за не будучи явным. Пожалуйста, старайтесь избегать подобных ситуаций в интересах поддерживающего код.

Источник: Python comparison operators chaining

+0

Фактически, если вы выполняете 'True в {bool}', вы получите False. – Nf4r

+0

Он возвращает False –

+1

@Jackddddd Обновлено объяснение! – kmario23

Смежные вопросы