【问题标题】:Can we annotate a variable in Python while avoiding runtime type erasure of annotation?我们可以在 Python 中对变量进行注解,同时避免运行时类型擦除注解吗?
【发布时间】:2021-08-24 23:29:57
【问题描述】:

我一直在阅读有关此主题的内容,我的理解是,如果我们对参数进行注释,Python 不会在运行时删除注释。所以在这个例子中:

def f(x:int):
    return x

x 是整数的事实在运行时仍然保留。 相比之下,如果我们有:

def f():
    y :int ; y=5 
    return y

那么y :int 不会被保留。无论如何在 Python 中为赋值语句声明类型,以便在运行时保留注释?

编辑:

我的意思是:

class A:
    def f(self,x:int):
        y :int ; y=5
        return (x,y)

print(typing.get_type_hints(A.f))

结果是:

{'x': <class 'int'>}

所以我们只能恢复参数类型但y:int已被删除

【问题讨论】:

  • 为了什么目的?
  • “x 是整数的事实仍然保留在运行时”是什么意思?我不知道有这样的事情,除了f.__annotations__ 本身。
  • 您能否说明您希望如何访问这些注释?例如,给定def f(ytype): y: ytype = ytype(); return y,您将如何恢复注释,ytype 仅针对f 的特定调用定义。
  • 请注意,在全局/类范围内,y: int = 5 确实创建了一个可访问的注解——在模块/类的__annotations__ 中。重要的不是陈述,而是范围。
  • @MisterMiyagi 你能澄清一下我将如何调用它吗?如果我做 print(f().__annotations__) 我得到那个'int'对象没有属性'annotations'。我是否需要使用此属性定义自定义类型?

标签: python python-3.x types python-3.8 type-hinting


【解决方案1】:

无法在运行时获取函数局部注释。这已在初始 PEP 中编码,此后未撤销。

PEP 562 - 变量 AnnotationsRuntime 的语法

Effects of Type Annotations

此外,在本地提供注释的价值并不能抵消必须在每次函数调用时创建和填充注释字典的成本。因此,函数级别的注释不会被评估和存储。


根本问题是函数局部注释可能依赖于函数局部状态:

def f(y_type):
    y: y_type = y_type() 
    return y

这使得“f 的函数局部注释”未定义——只有特定的调用 f(y_type) 具有明确定义的注释。因此,每次调用都必须重新创建注释——这对于每次调用来说都是一笔昂贵的开销,并且仍然不会在函数对象本身上公开注释。
由于具有函数局部注释的成本被认为不值得,因此它们在运行时被丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多