对于将前向引用作为字符串的类,我在调用tying.get_type_hints()时遇到了问题.我的代码可以在函数内部未定义的情况下运行.我在下面的Python3.10中复制了一个最小的例子:

import typing
class B:
  pass
class A:
  some_b: "B" 
print(typing.get_type_hints(A)) # prints {'some_b': <class '__main__.B'>}
import typing
def func():
  class B:
    pass
  class A:
    some_b: "B" 
  print(typing.get_type_hints(A)) 
func() # NameError: name 'B' is not defined

这是预期中的行为吗?有没有办法绕过这个问题,并确保对字符串的正向引用在正确的作用域中求值?

推荐答案

typing.get_type_hints允许您显式地传递本地命名空间,以用于通过localns参数解析引用.

from typing import get_type_hints


def func():
    class A:
        some_b: "B"

    class B:
        pass

    print(get_type_hints(A, localns=locals()))


func()

输出:{'some_b': <class '__main__.func.<locals>.B'>}

请参阅locals英镑的文档.


附注:通过使用延迟的批注求值(PEP 563),您可以省略引号:

from __future__ import annotations
from typing import get_type_hints


def func():
    class A:
        some_b: B

    class B:
        pass

    print(get_type_hints(A, localns=locals()))

Python相关问答推荐

Python(Polars):使用之前的变量确定当前解决方案的Vector化操作

如何从不同长度的HTML表格中抓取准确的字段?

了解shuffle在NP.random.Generator.choice()中的作用

为什么基于条件的过滤会导致pandas中的空数据框架?

pandas DataFrame中类型转换混乱

创建带有二维码的Flask应用程序,可重定向到特定端点

是pandas.DataFrame使用方法查询后仍然排序吗?

根据网格和相机参数渲染深度

配置Sweetviz以分析对象类型列,而无需转换

在内部列表上滚动窗口

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

根据另一列中的nan重置值后重新加权Pandas列

可变参数数量的重载类型(args或kwargs)

加速Python循环

如何在Polars中从列表中的所有 struct 中 Select 字段?

如何在表中添加重复的列?

用渐近模计算含符号的矩阵乘法

如何从列表框中 Select 而不出错?

未调用自定义JSON编码器

在Python中使用yaml渲染(多行字符串)