如何通过可选导入键入提示?

问题描述 投票:1回答:1

使用可选导入时,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'

如何使模块成功执行并保留静态类型检查功能,同时使此导入成为可选操作?

python mypy python-typing
1个回答
0
投票

[尝试将导入内容粘贴到文件顶部的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)具有库中有时仅存在的功能可能会使最终用户感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.