如何创建可以接收附加约束的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')) ->

我正在开发Python类型类的扩展,它可以获得额外的约束。我已经使用普通类实现了这一点,但我想以现有的类型类为基础。目前,我可以做以下事情:

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
,我认为我不应该这样做

现在还不清楚如何实现这样的非泛型类型