1

我有一个包含字符串列表的 python 类。我想比较这个类的两个实例。但是,我注意到如果我的班级变大,那么比较写起来会很麻烦。有没有比这更简单的方法来编写__eq__方法?我使用 List 而不是 Set,因为我想在稍后阶段用来自 JSON 的数据填充这个类。

json_one = {"var_one": "hello", "var_two": ["foo", "bar"]}
json_two = {"var_one": "hello", "var_two": ["bar", "foo"]}

@dataclass
class Test:
    var_one: str
    var_two: List[str]

    def __eq__(self, other):
        if isinstance(other, Test):
            return self.var_one == other.var_one\
                   and sorted(self.var_two) == sorted(other.var_two)
        return False


test_one = Test(**json_one)
test_two = Test(**json_two)

if test_one == test_two:
    print("yay we're equal with lists in different order")
4

1 回答 1

3

您可以使用 的输出定义您的类的实例这一事实json.load不应决定您的类的设计。而是“自然地”定义您的类,并提供一种使用 JSON 响应创建实例的方法。

from dataclasses import dataclass
import json

@dataclass
class Test:
    # Emphasize the independence of your class from any particular JSON object
    str1: str
    set_of_str1: set[str]

    @classmethod
    def from_json(cls, s):
        d = json.loads(s)
        return cls(d['var_one'], set(d['var_two']))


assert Test("foo", set(["bar", "baz"])) == \
        Test.from_json('{"var_one": "foo", "var_two": ["baz", "bar"]}')
于 2021-11-27T21:44:20.107 回答