gpt4 book ai didi

python - 约束 python 容器内的类型和属性

转载 作者:行者123 更新时间:2023-12-01 02:07:46 25 4
gpt4 key购买 nike

我想构建一个容器来存储对象,并且我想限制容器仅存储相同类型(类型未先验定义)和具有不同属性(例如 name在下面的示例中,以便它可以是一个索引)。

下面是假设容器派生自 list 对象的预期行为示例。

obj1 = Foo(name='Jon')
obj2 = Foo(name='Doe')
obj3 = Foo(name='Jon')
obj4 = Bar(name='Bob')

>>> MyContainer()
[]
>>> MyContainer([obj1, obj2])
[Foo(name='Jon'), Foo(name='Doe')]
>>> MyContainer([obj1, obj4])
TypeError: mixed types
>>> MyContainer([obj1, obj3])
ValueError: Same 'name' attribute

无论使用哪种方法填充容器,我都希望保留此行为:__init____add____iadd__追加,...

但是,如果可能的话,我希望一个空容器可以容纳任何类型,只要它们都相同。

我想知道实现它的正确方法应该是什么,我正在寻找建议。到目前为止,我考虑过从 list 派生它并重写方法,但我对此感到不舒服。我应该装饰它吗?我应该从头开始构建一个容器吗?是否已经有一个现有的容器可以满足我的目的(一种 dict 或 pandas.Dataframe)?

最佳答案

您可以从 list 派生您的类来实现此目的,然后检查所有可能进入实例的点,确保输入的内容都是 Foo:

class Foo: pass

class FooList(list):
def __init__(self, elements):
assert all(isinstance(element, Foo) for element in elements)
super().__init__(elements)

def append(self, element):
assert isinstance(element, Foo)
super().append(element)

def __add__(self, other):
return FooList(super().__add__(other)) # will do the checks implicitly

这只会在创建时检查。您现在可以继续并覆盖所有其他点(__iadd__()__setitem__()...)并在那里引入检查。

我当前的实现仅检查元素的类型。当然,您可以检查更多内容,例如检查您提到的相同名称。

不过,对于类型而言,我不确定这是一个好方法。使用 Python 的静态类型来代替怎么样?这不会在运行时引入太多开销。

关于python - 约束 python 容器内的类型和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48906207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com