从类型输入中提取数据

发布于 2021-01-29 16:08:48

typing除了类型提示以外,我在使用Python中的类型时遇到了一些问题:

>>> from typing import List
>>> string_list = ['nobody', 'expects', 'the', 'spanish', 'inqusition']
>>> string_list_class = List[str]

现在我想

  1. 检查是否string_list符合string_list_class
  2. 检查是否string_list_class为列表。
  3. 如果是这样,请检查课程,这string_list_class是一个列表。

我发现自己无法实现以下任何一个目标:

>>> isinstance(string_list, string_list_class)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/typing.py", line 708, in __instancecheck__
    return self.__subclasscheck__(type(obj))
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/typing.py", line 716, in __subclasscheck__
    raise TypeError("Subscripted generics cannot be used with"
TypeError: Subscripted generics cannot be used with class and instance checks

>>> issubclass(string_list_class, List)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/typing.py", line 716, in __subclasscheck__
    raise TypeError("Subscripted generics cannot be used with"
TypeError: Subscripted generics cannot be used with class and instance checks

文档也并没有帮助。同样,API似乎也不打算以这种方式使用,
但是,我需要使用该功能

闲逛

我找到答案2的一种方法是

>>> type(string_list_class)
<class 'typing._GenericAlias'>

艰难的我无权_GenericAlias自己创建它:

>>> _GenericAlias = type(List[str])
>>> isinstance(string_list_class, _GenericAlias)
True

但是,这似乎根本不是一个好的解决方案,并且True对于诸如此类的其他类也有好处Collection

对于1.和3.,我可以想象与repr(type(string_list))和一起黑客攻击某些东西,repr(string_list_class)并以某种方式将字符串与某物进行比较,但这也不是一个好的解决方案。

但是必须有更好的方法来做到这一点

关注者
0
被浏览
140
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    检查变量是否符合键入对象

    要检查是否string_list符合string_list_class,可以使用typeguard类型检查库。

    from typeguard import check_type
    
    try:
        check_type('string_list', string_list, string_list_class)
        print("string_list conforms to string_list_class")
    except TypeError:
        print("string_list does not conform to string_list_class")
    

    检查打字对象的通用类型

    要检查是否string_list_class为列表类型,可以使用Typical_inspect库:

    from typing_inspect import get_origin
    from typing import List
    
    get_origin(List[str]) # -> List
    

    您也可以使用私有__origin__字段,但是没有稳定性保证。

    List[str].__origin__ # -> list
    

    检查打字对象的类型参数

    要检查该类(string_list_class列表),您可以再次使用typeing_inspect库。

    from typing_inspect import get_parameters
    from typing import List
    
    assert get_parameters(List[str])[0] == str
    

    和以前一样,如果您愿意冒险,也可以使用一个私有字段

    List[str].__args__[0] # -> str
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看