为什么在Python中没有定义UserSet类?

Jyo*_*rup 5 python python-3.x

为什么python不提供UserSet扩展和定义用户定义Set的类。它确实提供了UserDictUserListUserString但没有UserSet

我指的是Python文档

ben*_*nvc 5

PEP 3108提供了一些关于为什么没有UserSet或类似的实现以类似的方式添加到UserDict等等的见解。

Guido 宣布将从 Py3K 的标准库中删除“愚蠢的旧东西”。这是故意开放式的。要删除的每个模块都需要有理由说明为什么它不应再与 Python 一起分发。

UserDictUserListUserString都列在 PEP 3108 的“过时”部分,并注明了以下原因并表明它们已移至collections模块中。

没有那么有用,因为类型可以是超类

鉴于它们被认为是“过时的”,因此类似的类没有为其他类型(如set )实现也就不足为奇了。

由于类型可以是超类,并且抽象基类为创建各种集合、序列、映射和其他类型的子类提供了合理的替代方案,这些类型的重大更改将难以通过扩展内置类型本身来实现,因此似乎没有必要包括这些“入门”类适用于collections.abc.

以下是UserSetwith一个非常基本的实现,该data属性将类的内容存储在真实中set(类似于 withUserDict等采用的方法)。虽然在标准库中包含这样的实现可能对您有用,但实现自己并不是非常困难(如果对某人可能“有用”的所有内容都包含在标准库中,Python 将变得非常臃肿)。

from collections.abc import Hashable, MutableSet

class UserSet(Hashable, MutableSet):
    __hash__ = MutableSet._hash

    def __init__(self, iterable=()):
        self.data = set(iterable)

    def __contains__(self, value):
        return value in self.data

    def __iter__(self):
        return iter(self.data)

    def __len__(self):
        return len(self.data)

    def __repr__(self):
        return repr(self.data)

    def add(self, item):
        self.data.add(item)

    def discard(self, item):
        self.data.discard(item)


s = UserSet([1,1,2,3])
print(s)
# {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)

  • @sanyash - 几乎所有已经为我们编写的代码都是“有用的”,但我不确定这是将其包含在标准库中的充分理由。查看答案编辑。 (4认同)