我可以使用«is»来比较静态变量吗?

时间:2015-03-11 11:10:40

标签: python enums comparison identity static-variables

Python PEP 435关于enum module说明了调查员should be compared with is而不是通常的==。我猜这个推理是因为枚举成员是静态的并且不会改变,所以它是有意义的。

我出于兼容性原因使用Python 2.7.9而且我不想在项目中引入太多新库,因此我不打算使用{2.7的Python 2.7.9端口{1}}模块。因此,我使用更简单的枚举形式:

enum

在这种情况下,使用class Color(object): red = 1 green = 2 blue = 3 进行比较仍然可以吗?更一般地说,可以将已知在程序生命周期内不会发生变化的静态类变量与is而不是is进行比较,而不管它们的类型如何?

注意:我认为只有静态变量的名称才会用于赋值/比较,而不是它的值。

2 个答案:

答案 0 :(得分:3)

你能吗? - 在CPython中实习小整数,所以无论你在哪里获得,来自x = 2的{​​{1}}将评估x is Color.green

你应该吗? 即可。首先,它没有概念上的意义 - 你真的关心它们是否是同一个确切的对象(身份True),或者它们是否具有相同的价值( 平等is)?如果值来自类本身以外的其他地方,例如,数据库或用户输入?另一方面,小整数的实习是一个实现细节,所以不应该依赖它。

  

更一般地说,可以将已知在程序生命周期内不会更改的静态类变量与==而不是is进行比较,无论其类型如何?

,因为这可能会失败,无论他们是“静态”

==

答案 1 :(得分:1)

可能,因为CPython对[-5, ..., 256]中的数字使用相同的地址(它们永远不会重新创建):

>>> (-5 + 0) is -5
True
>>> (-6 + 0) is -6
False
>>> (256 + 0) is 256
True
>>> (257 + 0) is 257
False

但它依赖于实施并不是一件好事。

为什么不使用==