You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中返回模块的函数应使用什么返回类型注解?

方法1:使用通用模块类型标注

如果你只需要标注返回值是「模块或者None」,不需要识别模块内的具体属性类型,直接用types.ModuleType结合可选类型即可:

import types
from typing import Optional

# Python 3.9及更早版本写法
def try_import_pyarrow() -> Optional[types.ModuleType]:
    try:
        import pyarrow
    except ImportError:
        pyarrow = None
    return pyarrow

# Python 3.10+ 支持联合类型运算符写法
def try_import_pyarrow() -> types.ModuleType | None:
    try:
        import pyarrow
    except ImportError:
        pyarrow = None
    return pyarrow

方法2:针对特定模块的精准类型标注

如果你安装了对应依赖的类型存根(比如pyarrow官方自带类型标注,或通过typeshed安装),可以直接用模块本身作为类型标注,类型检查器会自动识别返回模块的属性、方法类型,精度更高:

# 仅用于类型推导,运行时不会因为未安装pyarrow报错
from typing import TYPE_CHECKING
if TYPE_CHECKING:
    import pyarrow

# Python 3.10+写法,用引号包裹类型做前向引用避免运行时报错
def try_import_pyarrow() -> "pyarrow | None":
    try:
        import pyarrow
    except ImportError:
        pyarrow = None
    return pyarrow

这种写法的优势是,后续判断返回值非None后,类型检查器可以自动补全pyarrow的方法、属性,实现类型校验。


通用import_or_none函数标注

如果要实现类似pytest.importorskip的通用可选导入函数,可以用泛型实现全场景类型适配:

import importlib
import types
from typing import TypeVar, Optional

T = TypeVar("T", bound=types.ModuleType)

def import_or_none(module_name: str) -> Optional[T]:
    try:
        return importlib.import_module(module_name)
    except ImportError:
        return None

# 调用时类型检查器会自动推导返回类型为Optional[pyarrow]
pyarrow = import_or_none("pyarrow")

内容的提问来源于stack exchange,提问作者Tim Swena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:24:04