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
相关产品推荐
相关产品推荐

