如何创建可以接收附加约束的Python类型类
我正在开发Python类型类的扩展,它可以获得额外的约束。我已经使用普通类实现了这一点,但我想以现有的类型类为基础。目前,我可以做以下事情:如何创建可以接收附加约束的Python类型类,python,typing,Python,Typing,我正在开发Python类型类的扩展,它可以获得额外的约束。我已经使用普通类实现了这一点,但我想以现有的类型类为基础。目前,我可以做以下事情: def append(element: Any, list: Array(length='n')) -> Array(length='n + 1'): ... 但是我希望Array是现有类型类的一个子类。这样我就可以做一些事情,比如: def append(element: A, list: List[A](length='n')) ->
def append(element: Any, list: Array(length='n')) -> Array(length='n + 1'):
...
但是我希望Array
是现有类型类的一个子类。这样我就可以做一些事情,比如:
def append(element: A, list: List[A](length='n')) -> List[A](length='n + 1'):
...
遗憾的是,我找不到一个好的方法来让我只在类的某个地方存储额外的约束,就可以生成List[a](length='n')
返回类List[a]
。我设法做到的是:
class ConstrainedTypeMetaclass(typing.GenericMeta):
def __new__(cls, *args, **kwargs):
#kwargs['_root'] = True
return super().__new__(cls, *args, **kwargs)
def __repr__(self):
if hasattr(self, '_raw_constraints'):
return '{prefix}({raw_constraints})'.format(prefix=super().__repr__(), raw_constraints=self._raw_constraints)
else:
return super().__repr__()
class ConstrainedTypeMixin(metaclass=ConstrainedTypeMetaclass):
def __new__(cls, **raw_constraints):
return type(cls.__name__, (type(super().__new__(cls)),), {
'_raw_constraints': raw_constraints,
})
class ConstrainedSequence(ConstrainedTypeMixin, typing.Sequence[typing.T_co]):
def __getitem__(self, item):
pass
def __len__(self):
pass
它看起来很管用,但感觉很粗糙<代码>\uuuu repr\uuuu看起来不正确(表明此方法存在一些问题):
输出ConstrainedSequence[A]
,这很好\uuuu main\uuuu.ConstrainedSequence[~A]
输出typing.Sequence[A]
,这很好typing.Sequence[~A]
- 但是
输出ConstrainedSequence[A](length='A')
abc.ConstrainedSequence({'length':'A'})
\uuuu main\uuuu.ConstrainedSequence[~A]({'length':'A'})
此外,我还必须定义\uu getitem\uuuuuuu
和\uuuu len\uuuuuuu
,我认为我不应该这样做
现在还不清楚如何实现这样的非泛型类型