【发布时间】:2020-07-15 16:14:47
【问题描述】:
我在几个 if 项目中使用 Typeguard 在 Python 运行时进行类型检查。效果很好。
我遇到过这样一种情况,函数参数的类型是由几个动态收集的数据类型组成的typing.Union。例如
def find_datatypes():
# some stuff ...
return (str, int) # dynamically generated list / tuple
datatypes = find_datatypes()
现在我想从datatypes 生成一个typing.Union 以供最终在函数中使用。我希望解包语法能够工作:
my_union = typing.Union[*datatypes]
@typeguard.typechecked
def some_function(param: my_union):
pass
但是,它没有:
my_union = typing.Union[*datatypes]
^
SyntaxError: invalid syntax
我将如何实现我想要的?
【问题讨论】:
-
仅供参考,解包语法不起作用,因为这是
__getitem__语法,[...],而不是__call__语法,(...)。 -
Python 类型注解的设计几乎完全围绕静态用例。不太支持动态地执行任何事情。
-
@jonrsharpe 是啊...
__getitem__毕竟是一个函数,所以我想为什么不试试。通常,由于其令人难以置信的一致性,像这样奇怪的东西只适用于 Python。 -
@user2357112supportsMonica 是的,这也是“手册”所说的。相反,可以在运行时使用它们,这就是 Typeguard 存在的原因。知道如何使这个工作吗?
标签: python type-hinting python-typing dynamic-typing