[英]Best Practice for Equality in Python
是否有最佳實踐來確定兩個任意python對象的相等性? 假設我為某種對象編寫了一個容器,並且需要弄清楚新對象是否等於存儲在容器中的舊對象。
問題是我不能使用“ is”,因為這只會檢查變量是否綁定到同一對象(但是我們可能有一個對象的深層副本,在我看來,它等於原始對象)。 我也不能使用“ ==”,因為其中一些對象返回元素方式相等的值,例如numpy數組。
是否存在確定任何對象相等的最佳實踐? 例如會
repr(objectA)==repr(objectB)
滿足?
還是通常使用:
numpy.all(objectA==objectB)
如果objectA == objectB評估為“ []”,則可能失敗
干杯,羅伯特
編輯:
好的,關於第三條評論,我將詳細介紹“您對“相等對象”的定義是什么?
從嚴格的意義上講,我沒有任何關於平等的定義,而是讓對象決定它們是否相等。 據我了解,問題是,分別沒有針對eq或==的公認標准。 該語句可以返回數組或各種各樣的東西。
我想到的是讓一些運算符在eq和“ is”之間將其稱為SEQ(強等式)。 SEQ始終優於eq ,因為它將始終求值為單個布爾值(例如,對於可能意味着所有元素均相等的numpy數組),並確定對象是否認為自己相等。 但是,在內存中不同的對象也可以相等的意義上,SEQ不如“ is”。
我建議您編寫一個自定義的遞歸相等檢查器,如下所示:
from collections import Sequence, Mapping, Set
import numpy as np
def nested_equal(a, b):
"""
Compare two objects recursively by element, handling numpy objects.
Assumes hashable items are not mutable in a way that affects equality.
"""
# Use __class__ instead of type() to be compatible with instances of
# old-style classes.
if a.__class__ != b.__class__:
return False
# for types that implement their own custom strict equality checking
seq = getattr(a, "seq", None)
if seq and callable(seq):
return seq(b)
# Check equality according to type type [sic].
if isinstance(a, basestring):
return a == b
if isinstance(a, np.ndarray):
return np.all(a == b)
if isinstance(a, Sequence):
return all(nested_equal(x, y) for x, y in zip(a, b))
if isinstance(a, Mapping):
if set(a.keys()) != set(b.keys()):
return False
return all(nested_equal(a[k], b[k]) for k in a.keys())
if isinstance(a, Set):
return a == b
return a == b
假設可散列對象不能以影響相等性的方式可變的假設是相當安全的,因為如果將此類對象用作鍵,它將破壞命令和集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.