【发布时间】:2021-11-19 23:49:24
【问题描述】:
我正在做一些元编程,我需要一种动态定义类型提示的方法。有没有办法将参数数组传递给类型提示?比如:
# Some programatically generated list where I don't know the content until runtime
permitted_types = [int, str, bool, float, list, dict]
union = Union[*permitted_types]
上面的代码产生:
TypeError: Union[arg, ...]: each arg must be a type. Got [<class 'int'>, <class 'str'>, <class 'bool'>, <class 'float'>, <class 'list'>, <class 'dict'>]
有人知道这样做的语法吗?目前我被简化为以下内容,我讨厌它:
num_args = len(args)
if num_args == 1:
return origin[args[0]]
elif num_args == 2:
return origin[args[0], args[1]]
elif num_args == 3:
return origin[args[0], args[1], args[2]]
elif num_args == 4:
return origin[args[0], args[1], args[2], args[3]]
elif num_args == 5:
return origin[args[0], args[1], args[2], args[3], args[4]]
elif num_args == 6:
return origin[args[0], args[1], args[2], args[3], args[4], args[5]]
else:
# Raise error
【问题讨论】:
-
类型提示是一个存在于运行时之外的概念。换句话说,您必须提前知道所有支持的类型的超集。但是,您可以使用
TypeVar之类的东西来表示 generics。 -
@0x5453 - 它们大多存在于运行时之外 - 某些情况会导致它们以某些形式持续到运行时。例如:``` @dataclass class Foo: obj: List[str] print(Foo.__dataclass_fields__['obj'].type) ``` (抱歉格式化) - 你可以看到该类型在运行时存在
-
如果你直到运行时才知道
permitted_types的内容,它应该如何帮助你验证代码的正确性?或者你还希望通过使用类型注释来完成什么? -
@tofarr 是的,好点。数据类是在运行时使用类型提示的一个很好的例子。
__annotations__属性是另一个有趣的例子。 -
@KarlKnechtel - 在这种情况下,目标不是使用类型提示来验证代码的正确性,而是帮助生成数据编组/解组的绑定。 (类似于 marshmallow / pydantic,但有一些额外的秘密)然后类型注释用于验证客户端代码是否正确。
标签: python python-3.x type-hinting python-typing