为可能未加载的模块中的类型键入提示?

Type hints for types from modules which may not be loaded?

如何定义类型提示以在未导入 Geopandas 时仍将 GeoPandas GeoDataFrame 指定为选项但不报错? IE: 定义一个不存在模块的类型提示

给定一个 class,它接受类型为 DataFrame 或 GeoDataFrame 的参数,通常只会导入 Pandas,但偶尔也会导入 GeoPandas。

class 必须能够互换取一帧。如果param定义为:Union[pandas.Dataframe, geopandas.geodataframe.GeoDataFrame] 没有导入GeoPandas时会报错,反之亦然。 Pandas 或 Geopandas 不会仅出于类型提示的目的而导入。

Any 是定义 geopandas 数据框的选项,但我希望更简洁。 Union[pandas.Dataframe, Any] 感觉毫无意义,因为它不提供替代参数可能是什么类型的上下文,并且不涵盖加载 Geopandas 而不是 Pandas.

的情况

我看过,但情况不一样。

假设 Python >= 3.7,添加一个 from __future__ import annotations 导入以推迟类型提示评估。这意味着如果您在类型提示中引用未加载的对象,解释器实际上不会抱怨。

下面的代码执行得很好,不需要任何额外的导入:

from __future__ import annotations
from typing import Union


def main(data: Union[str, pd.DataFrame]) -> None:
    print(data)


if __name__ == '__main__':
    main('some_data_here')

此行为是从 Python 3.10 开始的默认行为,这意味着我们不需要将来的导入,但已推迟到 Python 3.11。

(另外请注意,技术上您不需要使用 Union[pandas.Dataframe, geopandas.geodataframe.GeoDataFrame] - 使用 DataFrame 类型提示就足够了,因为 GeoDataFrameDataFrame).