2017-02-19 45 views
1

我做一个分配编译帕斯卡尔的一个子集,并在最初的方案还有的像这样的代码行:为什么下面的代码返回True?

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

这让我真的很困惑,x.tp == y.tp返回一个布尔值TrueFalse,因此True/False in {Bool, Int}将始终返回False

BoolInt的定义如下:

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'>和实际上在临屋区t集。

Reference Manual on Comparisons

比较可以任意链的,例如,x < y <= z相当于x < y and y <= z,不同之处在于y只计算一次(但在这两种情况下z不评估在所有时x < y被发现为False)。

+0

这应该不重要,因为它具有相同的优先级,它将从左到右评估是不是? –

+0

@Jackddddd == ==得到了评估,'{bool,Int}中的y.tp也得到了评估(因为相等是'True')并且使整个事情成为'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

如果您在{bool}中设置为True,您将得到False。 – Nf4r

+0

返回False –

+1

@Jackddddd更新了解释! – kmario23

相关问题