Python 如何动态定义'typing.Union'?

Python 如何动态定义'typing.Union'?,python,typing,python-typing,dynamic-typing,Python,Typing,Python Typing,Dynamic Typing,我在一些if项目中使用Python在运行时进行类型检查。它工作得很好 我遇到过这样一种情况:函数参数的类型是由几个动态收集的数据类型组成的typing.Union。例如 def find_数据类型(): #一些东西。。。 返回(str,int)#动态生成的列表/元组 datatypes=find_datatypes() 现在我想从datatypes生成一个typing.Union,以便最终在函数中使用。我希望解包语法能够正常工作: my_union=typing.union[*数据类型] @t

我在一些if项目中使用Python在运行时进行类型检查。它工作得很好

我遇到过这样一种情况:函数参数的类型是由几个动态收集的数据类型组成的
typing.Union
。例如

def find_数据类型():
#一些东西。。。
返回(str,int)#动态生成的列表/元组
datatypes=find_datatypes()
现在我想从
datatypes
生成一个
typing.Union
,以便最终在函数中使用。我希望解包语法能够正常工作:

my_union=typing.union[*数据类型]
@typeguard.typechecked
定义一些函数(参数:my_union):
通过
但是,它没有:

my_union=typing.union[*数据类型]
^
SyntaxError:无效语法
我怎样才能实现我想要的?

你可以这样做:

my_union = typing.Union[datatypes]
在运行时,
thing[x,y]
已经相当于
thing[(x,y)]

也就是说,有一些限制需要牢记。特别是,当使用字符串注释(这将成为Python 3.10中的默认值)时,
my_union
必须在
some_function
typeguard
全局名称空间中可用,或者其他任何东西才能在运行时解析注释。这限制了许多闭包用例,以及许多动态添加注释的尝试


此外,如您所料,MyPy将不考虑任何有效的。

FY-拆包语法不起作用,因为这是“代码”>GyTyMyTys语法,<代码>……/代码>,而不是<代码> >子CALLYX<语法,<代码>(…)>代码>。Python类型注释的设计几乎全部集中在静态用例上。动态地做任何事情都没有得到很好的支持。@jonrsharpe是的<代码>\uuu getitem\uuu毕竟是一个函数,所以我想为什么不试试。通常,像这样奇怪的东西在Python中工作,这要归功于它令人难以置信的一致性。@user2357112supportsMonica是的,这是“手册”中也提到的。相反,可以在运行时使用它们,这就是Typeguard存在的原因。你知道如何让这个工作吗?嗯,未来库的文档应该更新。它仍然说,
注释
在版本4中成为强制性的。我不确定PEP 563是什么时候更新为Python 3.10的(或者它总是说Python 3.10?@chepner:我很确定PEP 563以前说的是4.0。关于这个问题的讨论看起来他们正在努力争取在3点10分之前完成。