如何实现以import my_wrapper as pd调用自定义pandas封装库?
实现
import my_wrapper as pd的导入方式扩展Pandas功能 背景
直接修改site-packages/pandas/__init__.py可以扩展Pandas功能,但Pandas版本升级后,修改的代码会被覆盖丢失。当前已在site-packages中创建my_wrapper模块,通过给PandasObject绑定自定义方法实现功能扩展,但只能通过from my_wrapper import pandas as pd的方式导入,希望改为更简洁的import my_wrapper as pd导入方式。
修改方案
修改my_wrapper模块下的__init__.py文件,让模块本身完全继承Pandas的所有属性,同时保留扩展方法:
import pandas as pd_core from pandas.core.base import PandasObject # 定义扩展方法 def has_stackoverflow(ser: pd_core.Series): return ser[ser.str.contains('stackoverflow', case=False, regex=True)] # 将扩展方法绑定到Pandas的基础对象 PandasObject.has_stackoverflow = has_stackoverflow # 把Pandas的所有属性导入当前模块命名空间 __all__ = pd_core.__all__ globals().update(pd_core.__dict__) # 可选:同步Pandas的版本、包名等元信息,增强一致性 __name__ = pd_core.__name__ __package__ = pd_core.__package__ __version__ = pd_core.__version__
使用方式
修改完成后,直接通过以下方式导入即可使用扩展后的Pandas:
import my_wrapper as pd # 测试扩展方法 result = pd.Series(['s','as stackoverflow sa']).has_stackoverflow() print(result)
原理说明
通过将Pandas模块的所有属性(包括类、函数、常量等)复制到my_wrapper模块的命名空间,让my_wrapper对外暴露的接口和原生Pandas完全一致。同时提前完成了扩展方法的绑定,因此导入后所有Pandas对象都能直接使用新增的has_stackoverflow方法,且不会影响Pandas的原生功能。
内容的提问来源于stack exchange,提问作者Anton Frolov
相关产品推荐
相关产品推荐

