gpt4 book ai didi

包对象的 Python 前向引用

转载 作者:行者123 更新时间:2023-12-03 08:15:35 25 4
gpt4 key购买 nike

我怀疑答案是肯定的,但我只是想问清楚。例如,如果我有一个函数需要使用 numpy 对象,但我没有直接在模块中使用 numpy,我可以使用前向引用来键入暗示我的论点而不是直接 import numpy

换句话说(假设Python 3.7+),我可以这样做吗

# forward-reference.py

def my_func(arr: "np.ndarray") -> int:
# does some operations with arr

而不是这个

# direct-import.py

import numpy as np

def my_func(arr: np.ndarray) -> int:
# do some operations on arr...

我无法想象核心开发人员会要求程序员仅仅为了类型提示而导入模块。我的 pylintflake8 linters 会正确地将它们拾取为未使用的模块,我认为所有这些额外的导入将是相当多余的。

编辑

为了测试,我创建了两个文件:demo1.pydemo2.py(两者都位于同一目录中):

演示1.py

# demo1.py

import numpy as np

from demo2 import my_func

if __name__ == "__main__":
a = np.array([1, 2, 3])
print(my_func(a))

demo2.py

# demo2.py

def my_func(arr: "np.ndarray") -> int:
return arr[0]

demo1.py 上运行 mypy 不会出现错误,但在 demo2.py 上使用 numpy.ndarray< 运行它 给出错误:

demo2.py:1: error: Name "numpy" is not defined

np.ndarray给出错误:

demo2.py:1: error: Name "np" is not defined

因此,如果我首先设计一个模块 demo2.py,希望它在设计 demo1.py 之前接受 numpy 数组,mypy会报错。

有更好/“正确”的方法来处理上述情况吗?

最佳答案

不,你不能。

您需要在范围内包含名称(毕竟,您可以完成Ministry of Silly Imports并完成将数学导入为np),但您可以使用typing.TYPE_CHECKING如果您不想真正导入模块:

from typing import TYPE_CHECKING

if TYPE_CHECKING: # never true unless you're a type checker
import numpy as np

def my_func(arr: "np.ndarray") -> int:
pass # does some operations with arr

除此之外,类型检查器不(或不应该)关心你如何称呼这些东西;他们将尽最大努力解析符号,例如这应该有效:(但请不要...)

from typing import TYPE_CHECKING

if TYPE_CHECKING: # never true unless you're a type checker
import numpy as noooooooooop
bazoop = noooooooooop.ndarray
glerp = int

def my_func(arr: "bazoop") -> "glerp":
pass # does some operations with arr

关于包对象的 Python 前向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69529883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com