python:使用类型提示动态检查类型

Posted

技术标签:

【中文标题】python:使用类型提示动态检查类型【英文标题】:python : using type hints to dynamically check types 【发布时间】:2021-12-25 12:44:45 【问题描述】:

python 支持类型提示:

https://docs.python.org/3/library/typing.html

我想知道这些提示是否也可用于在运行时动态强制执行类型。

例如:

class C:

    def __init__(self):
        self.a : int = 0

    def __str__(self):
        return str(self.a)

    @classmethod
    def get(cls,**kwargs):
        c = cls()
        for k,v  in kwargs.items():
            setattr(c,k,v) 
            # ValueError exception thrown here ?
        return c

attrs = "a":"a" # developer wanted an int !
c = C.get(**attrs)
print(c)

简而言之,我想避免在get函数中重新输入属性“a”的类型:

    @classmethod
    def get(cls,**kwargs):
        c = cls()
        for k,v  in kwargs.items():
            if k=="a" and not isinstance(v,int):
                raise ValueError()
            setattr(c,k,v) 
        return c

有没有办法“重用”构造函数中给出的“a”应该是一个 int 的信息?

注意:对这个问题的回答表明,至少对于函数的自省参数类型提示可以访问:

How to introspect on PEP 484 type hints?

【问题讨论】:

无运行时强制。线索在术语hint【参考方案1】:

我想知道这些提示是否也可用于在运行时动态强制执行类型。

在某些情况下,使用外部库 - 答案是肯定的。阅读下文。

如果你的实际用例很简单,就像你的 C 类,我会去使用数据类和像 dacite 这样的库。您将无法创建 c2,因为您没有传递 int。 所以 dacite 设法“看到”a 应该是 int 并引发异常

from dataclasses import dataclass
from dacite import from_dict
@dataclass
class C:
  a:int = 0

d1 = 'a':3

c1: C = from_dict(C,d1)
print(c1)
print(C.__annotations__)

d2 = 'a':'3'

c2: C = from_dict(C,d2)

输出

C(a=3)
'a': <class 'int'>

Traceback (most recent call last):
  File "main.py", line 14, in <module>
    c2: C = from_dict(C,d2)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/dacite/core.py", line 68, in from_dict
    raise WrongTypeError(field_path=field.name, field_type=field.type, value=value)
dacite.exceptions.WrongTypeError: wrong value type for field "a" - should be "int" instead of value "3" of type "str"

【讨论】:

感谢您介绍数据类和 dacit。在我将其标记为正确答案之前,我是否可以要求您通过添加 C.__annotations__ 提供对 C 类属性类型的内省进行编辑? @Vince - 你为什么要我这样做?这里的附加值是什么? Actail 元数据来自“字段”(在 dacite 的情况下)——github.com/konradhalas/dacite/blob/… 无论如何.. 我已将其添加到帖子中。 -- print(C.__annotations__)

以上是关于python:使用类型提示动态检查类型的主要内容,如果未能解决你的问题,请参考以下文章

PyCharm 类型提示怪异

python 语言特性

如何在 python 3.6 中使用类型提示?

python 注解

Python 3.5类型提示动态生成的实例属性

如何使用类型提示为参数指定多种类型? [复制]