簡體   English   中英

Python平等最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM