我正在尝试使用工厂函数来生成一些类型注释——特别是针对tuple
类型。我有一个运行良好的工厂版本(例如,它在 MyPy 中令人满意地编译、运行和签出):
import typing as tx
HomogenousTypeVar = tx.TypeVar('HomogenousTypeVar')
TupleTypeReturnType = tx.Type[tx.Tuple[HomogenousTypeVar, ...]]
def TupleType(length: int,
tuptyp: tx.Type[HomogenousTypeVar] = str) -> TupleTypeReturnType:
""" Create a type annotation for a tuple of a given type and length """
assert length > 0
return tx.Tuple[tuple(tuptyp for idx in range(length))]
… 用法如下:
class Thing(object):
__slots__: TupleType(2) = ('yo', 'dogg')
other_fields: TupleType(4) = ('i', 'heard',
'you', 'like')
# etc, or what have you
…但是,当我尝试添加对typing.ClassVar
注释的支持时,我没有成功,看起来像这样:
import typing as tx
HomogenousTypeVar = tx.TypeVar('HomogenousTypeVar')
TupleTypeReturnType = tx.Union[tx.Type[tx.Tuple[HomogenousTypeVar, ...]],
tx.Type[tx.ClassVar[tx.Tuple[HomogenousTypeVar, ...]]]]
def TupleType(length: int,
tuptyp: tx.Type[HomogenousTypeVar] = str,
clsvar: bool = False) -> TupleTypeReturnType:
""" Create a type annotation for a tuple of a given type and length,
specifying additionally whether or not it is a ClassVar """
assert length > 0
out = tx.Tuple[tuple(tuptyp for idx in range(length))]
return clsvar and tx.ClassVar[out] or out
...在此更改之后,代码甚至最初都不会编译 - 它无法通过模块TypeError
深处的a 来编译:typing
TypeError: typing.ClassVar[typing.Tuple[~HomogenousTypeVar, ...]] 作为类型参数无效
......随着错误的发生,我觉得有点像打电话;我的意思是,不是所有东西都应该typing
以某种方式是有效的类型参数吗?
在与 相关的typing
源代码ClassVar
中,文档字符串中提到了一些对其使用的限制——但这不是其中之一。我有什么明显的遗漏吗?我以这种方式使用此注释的尝试是不切实际的吗?我还能尝试什么?