为什么python不提供UserSet扩展和定义用户定义Set的类。它确实提供了UserDict,UserList,UserString但没有UserSet。
我指的是Python文档
PEP 3108提供了一些关于为什么没有UserSet或类似的实现以类似的方式添加到UserDict等等的见解。
Guido 宣布将从 Py3K 的标准库中删除“愚蠢的旧东西”。这是故意开放式的。要删除的每个模块都需要有理由说明为什么它不应再与 Python 一起分发。
UserDict、UserList和UserString都列在 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)
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |