Python 从类型类型中提取数据
我在Python中使用Python 从类型类型中提取数据,python,python-3.x,generics,instanceof,typing,Python,Python 3.x,Generics,Instanceof,Typing,我在Python中使用类型时遇到了一些问题,除了类型提示之外: 输入导入列表中的>> >>>string_list=['nobody','expected','the','西班牙语','inqusion'] >>>string\u list\u class=list[str] 现在我想 检查string\u list是否符合string\u list\u class 检查string\u list\u class是否为列表 如果是这样,请检查该类,该类是一个类的列表 我发现自己无法实现以下任何
类型
时遇到了一些问题,除了类型提示之外:
输入导入列表中的>>
>>>string_list=['nobody','expected','the','西班牙语','inqusion']
>>>string\u list\u class=list[str]
现在我想
string\u list
是否符合string\u list\u class
string\u list\u class
是否为列表>>isinstance(字符串列表、字符串列表类)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/cillar/python/3.7.0/Frameworks/python.framework/Versions/3.7/lib/python3.7/typing.py”,第708行,在instancecheck中__
返回自我检查子项检查(类型(obj))
文件“/usr/local/ceral/python/3.7.0/Frameworks/python.framework/Versions/3.7/lib/python3.7/typing.py”,第716行,在_子类检查中__
raise TypeError(“下标泛型不能与一起使用”)
TypeError:下标泛型不能用于类和实例检查
>>>issubclass(字符串\列表\类,列表)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/ceral/python/3.7.0/Frameworks/python.framework/Versions/3.7/lib/python3.7/typing.py”,第716行,在_子类检查中__
raise TypeError(“下标泛型不能与一起使用”)
TypeError:下标泛型不能用于类和实例检查
在这方面,API也没有真正的帮助。而且API似乎不打算这样使用,但是,我需要使用该功能
闲逛
我找到了一个答案2,就是
>>类型(字符串列表类)
很难,我无法访问\u genericalia
我可以自己构建它:
>\u GenericAlias=type(列表[str])
>>>isinstance(字符串、列表、类、泛型)
真的
然而,这似乎根本不是一个好的解决方案,它还为其他类(如Collection
)生成True
对于1.和3.我可以想象用repr(type(string_list))
和repr(string_list_class)
对某个东西进行黑客攻击,并以某种方式将该字符串与某个东西进行比较,但这也不是一个好的解决方案
但必须有更好的方法来执行此操作检查变量是否符合键入对象
要检查string\u list
是否符合string\u list\u class
,可以使用类型检查库
来自typeguard导入检查\u类型
尝试:
检查类型(字符串列表、字符串列表、字符串列表类)
打印(“字符串列表符合字符串列表类”)
除类型错误外:
打印(“字符串列表不符合字符串列表类”)
检查类型化对象的泛型类型
要检查string\u list\u class
是否为列表类型,可以使用库:
通过键入检查导入获取来源
从输入导入列表开始
获取_原点(列表[str])#->List
您也可以使用private\uuuuu origin\uuuuu
字段,但它没有稳定性保证
List[str]。uuu origin_uu#->List
检查类型对象的类型参数
要检查类,string\u list\u class
是的列表,您可以再次使用库
通过键入\u检查导入获取\u参数
从输入导入列表开始
断言获取参数(列表[str])[0]==str
和以前一样,如果你喜欢冒险,也可以使用一个私人领域
List[str]。\uuuu args\uuuu[0]#->str
我明白第1点,但第2点的目的是什么?如果string\u list
符合string\u list\u class
,那么您已经知道它是一个列表。我不知道第3点应该是什么意思。我想检查string\u list\u class
是否通常是一个列表类型。它可能是str
,int的列表
,MyObject
或其他内容。这与1无关。对于3,我想从列表[MyObject]中提取MyObject
。好的,我明白了。但是……我不确定同时问3个基本上不相关的问题是否是个好主意……我同意,但它们不是完全不相关的IMHO,对其中一个或两个问题的回答可以回答其他问题。我找不到解决方案,但如果有,同一来源可能也可以回答其他问题ns.对于第3点,请参见.并可能对第2点有所帮助。值得注意的是,在python 3.9中键入_inspect的许多功能都不起作用。不幸的是,对泛型类型执行运行时检查似乎有点不可靠请参见