- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如果您在 Python 3.7 中执行以下语句,它将(根据我的测试)打印 b
:
if None.__eq__("a"):
print("b")
但是,None.__eq__("a")
的计算结果为 NotImplemented
。
自然,"a".__eq__("a")
的计算结果为 True
,"b".__eq__("a")
计算结果为 False
。
我最初在测试函数的返回值时发现了这一点,但在第二种情况下没有返回任何内容——因此,该函数返回了 None
。
这是怎么回事?
最佳答案
这是一个很好的例子,说明为什么不应直接使用 __dunder__
方法,因为它们通常不适合替代等效运算符;您应该使用 ==
运算符代替相等比较,或者在这种特殊情况下,在检查 None
时,使用 is
(跳到答案的底部以获取更多信息)。
你已经完成了
None.__eq__('a')
# NotImplemented
返回 NotImplemented
因为被比较的类型不同。考虑另一个以这种方式比较具有不同类型的两个对象的示例,例如 1
和 'a'
。执行 (1).__eq__('a')
也不正确,会返回 NotImplemented
。比较这两个值是否相等的正确方法是
1 == 'a'
# False
这里发生的是
(1).__eq__('a')
,返回NotImplemented
。这表示不支持该操作,所以'a'.__eq__(1)
被调用,它也返回相同的 NotImplemented
。那么,False
。这是一个不错的小 MCVE,它使用一些自定义类来说明这是如何发生的:
class A:
def __eq__(self, other):
print('A.__eq__')
return NotImplemented
class B:
def __eq__(self, other):
print('B.__eq__')
return NotImplemented
class C:
def __eq__(self, other):
print('C.__eq__')
return True
a = A()
b = B()
c = C()
print(a == b)
# A.__eq__
# B.__eq__
# False
print(a == c)
# A.__eq__
# C.__eq__
# True
print(c == a)
# C.__eq__
# True
当然,这并不能解释为什么该操作返回 true。这是因为 NotImplemented
实际上是一个真值:
bool(None.__eq__("a"))
# True
同,
bool(NotImplemented)
# True
有关哪些值被认为是真值和假值的更多信息,请参阅 Truth Value Testing 上的文档部分,以及 this answer .值得注意的是,NotImplemented
是真实的,但如果类定义了返回的 __bool__
或 __len__
方法,情况就不同了False
或 0
分别。
如果您想要 ==
运算符的等效功能,请使用 operator.eq
:
import operator
operator.eq(1, 'a')
# False
但是,如前所述,对于 此特定场景,您正在检查 None
,请使用 is
:
var = 'a'
var is None
# False
var2 = None
var2 is None
# True
与此功能等效的是使用 operator.is_
:
operator.is_(var2, None)
# True
None
是一个特殊的对象,在任何时间点内存中只存在一个版本。 IOW,它是 NoneType
类的唯一单例(但同一个对象可能有任意数量的引用)。 PEP8 guidelines明确说明:
Comparisons to singletons like
None
should always be done withis
oris not
, never the equality operators.
总之,对于像 None
这样的单例,使用 is
进行引用检查更合适,尽管 ==
和 is
可以正常工作。
关于python - 为什么 `if None.__eq__("a")` 似乎评估为 True(但不完全)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984116/
根据 this page , set.intersection 使用 __eq__ 方法测试元素是否相等。谁能向我解释为什么这会失败? >>> Class Foo(object): >>> d
所以下面的内置类有一个 __eq__ 属性,(我假设)这就是为什么你可以测试它们的实例是否相等: >>> 1.2.__eq__( 1.2 ) True >>> 1.2 == 1.2 True >>>
在我正在处理的问题中,数据标识符的形式为 scope:name,既是 scope 又是 name 字符串. name 由点分隔的不同部分,如 part1.part2.part3.part4.part5
我有一组对象,并且有兴趣从该组中获取特定对象。经过一番研究,我决定使用此处提供的解决方案:http://code.activestate.com/recipes/499299/ 问题是它似乎不起作用。
我有一个父数据类和一个子数据类继承第一个类。我重新定义了__eq__()父数据类中的方法。但是当我比较对象子数据类时,它不使用 __eq__()父数据类中定义的方法。为什么会发生这种情况?我该如何解决
我正在用 Python 编写 DSL,我想重载运算符以便能够轻松编写 DSL 的表达式。例如,我想编写 Var("a") + Var("b") 并获得 Add(Var("a"), Var("b") 的
如果我像这样在 Python 2.7 中定义一个对象: class C(object): def __eq__(self, other): return object.__eq
目前,我正在研究 Python 的内置类型。我很困惑调用什么方法来检查键是否在字典中。例如,如果我检查 int 类型的键是否在字典中,则仅当 dictionary.keys() 包含它时,才会在后台调
我读过这个(来自 here ): User-defined classes have __eq__() and __hash__() methods by default; with them, al
在将功能移植到程序的 Python 3.1 分支时,我遇到了一个奇怪的错误。我将其缩小为以下假设: 与 Python 2.x 相比,在 Python 3.x 中,如果对象具有 __eq__ 方法,则它
我有一个类型,其中相等比较没有意义。明确比较此类型的两个实例的引用或值相等性将指示调用代码中的逻辑错误。 定义 __eq__ 引发异常是不是很糟糕?这有什么陷阱吗?它是否作为某些常见操作的一部分被隐式
我有一个Python程序,其中有一个名为Vector的类,并且该类内部有一个空列表,该列表正在运行时填充。这是初始化: def __init__(self,n): self.vector =
以下代码给出错误信息: class Test(object): def __init__(self, test = 0): self.test = test if __
我还有一个问题要问你。 我有一个带有列表“元信息”的 python 类。此列表包含我的类可能 包含的变量名称。我编写了一个 __eq__ 方法,如果 self 和 other 具有来自 metainf
我正在处理一个集合类,我想为其创建一个 __eq__ 方法。事实证明,它比我想象的要微妙得多,而且我注意到内置集合类的工作方式有几个错综复杂的地方。 真正对我帮助最大的是一个很好的例子。在标准库或任何
假设我有以下程序: class A(object):
为类实现自定义相等函数时,首先检查身份是否有意义?一个例子: def __eq__(self, other): return (self is other) or (other criteri
当我尝试重写魔术方法 __eq__,并使用 super 访问 object 中的基本方法时,出现错误.这不可能是一个错误,但感觉确实像一个错误: class A(object): def __
我遇到了一个问题,我将一个实例添加到一个集合中,然后进行测试以查看该对象是否存在于该集合中。我已经重写了 __eq__() 但在包含测试期间它没有被调用。我是否必须改写 __hash__()?如果是这
在将功能移植到我的程序的 Python 3.1 分支时,我遇到了一个奇怪的错误。我将其缩小到以下假设: 与 Python 2.x 相比,在 Python 3.x 中,如果一个对象具有 __eq__ 方
我是一名优秀的程序员,十分优秀!