Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何对typing.Union子类化?_Python_Python 3.x_Python 3.8_Python Typing - Fatal编程技术网

Python-如何对typing.Union子类化?

Python-如何对typing.Union子类化?,python,python-3.x,python-3.8,python-typing,Python,Python 3.x,Python 3.8,Python Typing,我试图将Union子类化,不是改变它的行为,而是创建一个decorator来检查特定类型的Union 所以我试过: 从键入import Union开始 类MyUnion(Union[MyBaseDBClass,int]): 通过 #或 类别MyUnion(Union): 通过 #... #下面是我不能使用别名的原因,我想在不同的场景中重用它 #我正在制作一个装饰器,它将自动获取数据库中的对象 #如果给定int(id),但如果对象作为参数给定,则不执行任何操作 def user_是_admin(用

我试图将Union子类化,不是改变它的行为,而是创建一个decorator来检查特定类型的Union

所以我试过:

从键入import Union开始
类MyUnion(Union[MyBaseDBClass,int]):
通过
#或
类别MyUnion(Union):
通过
#...
#下面是我不能使用别名的原因,我想在不同的场景中重用它
#我正在制作一个装饰器,它将自动获取数据库中的对象
#如果给定int(id),但如果对象作为参数给定,则不执行任何操作
def user_是_admin(用户:MyUnion[user,int]):
#...
通过
def项目处于活动状态(项目:MyUnion[project,int]):
#...
通过
以上两类都给出了

File "/usr/lib/python3.8/typing.py", line 317, in __new__
raise TypeError(f"Cannot subclass {cls!r}")
TypeError: Cannot subclass <class 'typing._SpecialForm'>
文件“/usr/lib/python3.8/typing.py”,第317行,新__
raise TypeError(f“不能子类{cls!r}”)
TypeError:无法创建子类

那么,我该怎么做呢?我在文档中看到,您只需要将Union具有的特定协议添加到您的类中,但我没有找到这些协议是什么

为什么要使用子类化而不是
MyUnion=Union[str,int]
?您认为
Union
Union[str,int]
的子类是什么?类型提示本质上是类型的超集;您可以使用任何类型作为类型提示,但有些类型提示不是类型。子类化应用于类型,而不是类型提示。(更复杂的是,类型提示是作为类实现的,但实现的方式会阻止您使用它们做类一样的事情,比如子类化它们。)提供了更多的上下文,解释了为什么别名不工作等等,我是否只需要一个实现的类。\uu getitem\uuuuu?我想我还是不太清楚你在问什么,但是如果问题是如何生成一个“类型级别”的子类,它在运行时不存在,只是为了正确性而存在,那么你可能正在寻找。