使用可选导入时,ie仅将包导入函数内部,因为我希望它成为包的可选依赖项,有没有一种方法可以提示输入函数的返回类型,例如属于此可选依赖项的类?
以pandas
作为可选依赖项给出一个简单示例:
def my_func() -> pd.DataFrame:
import pandas as pd
return pd.DataFrame()
df = my_func()
在这种情况下,由于import
语句位于my_func
之内,因此,此代码无疑会引发:
NameError:未定义名称'pd'
如果使用字符串文字类型提示,则即:
def my_func() -> 'pd.DataFrame':
import pandas as pd
return pd.DataFrame()
df = my_func()
现在可以毫无问题地执行该模块,但是mypy
会抱怨:
错误:未定义名称'pd'
如何使模块成功执行并保留静态类型检查功能,同时使此导入成为可选操作?
[尝试将导入内容粘贴到文件顶部的if typing.TYPE_CHECKING
语句中。该变量在运行时始终为false,但出于类型提示的目的,始终被视为true。
例如:
if typing.TYPE_CHECKING
您也可以执行# Lets us avoid needing to use forward references everywhere
# for Python 3.7+
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
import pandas as pd
def my_func() -> pd.DataFrame:
return pd.DataFrame()
,但我认为这使某人很难说出正在发生的事情。
一个警告是,这的确意味着尽管熊猫在运行时将是可选的依赖项,但出于类型检查的目的,它仍将是必需的。
您可以使用的另一个选项是mypy的if False:
标志。这将使您可以更精细地控制对代码的哪些部分进行类型检查。例如,您可以执行以下操作:
--always-true
and--always-false
...然后在假设已导入大熊猫的情况下执行--always-true
进行类型检查,并在缺少熊猫的情况下进行--always-false
进行类型检查。
[这可以帮助您发现意外使用某个功能的情况,而该功能需要一个本来不需要它的功能的熊猫-尽管需要注意的是(a)这是仅适用于mypy的解决方案,并且(b)具有库中有时仅存在的功能可能会使最终用户感到困惑。