Liq*_*ius 3 python python-typing
如何定义类型提示以在未导入 Geopandas 时仍将 GeoPandas GeoDataFrame 指定为选项而不是错误?IE:在不存在模块的情况下定义类型提示
给定一个采用 DataFrame 或 GeoDataFrame 类型的参数的类,通常只会导入 Pandas,但有时 GeoPandas 也会被导入。
该类必须能够互换地从任一框架中获取框架。如果参数定义为: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')
Run Code Online (Sandbox Code Playgroud)
此行为从 Python 3.10 开始是默认行为,这意味着我们将来不需要导入,但它已被推迟到 Python 3.11。
(另请注意,从技术上讲,您不需要使用Union[pandas.Dataframe, geopandas.geodataframe.GeoDataFrame]- 类型提示 withDataFrame就足够了,因为 aGeoDataFrame是 a 的实例DataFrame)。