在pandas中,许多函数都有一长串可选参数,每个参数都有一个默认值。
如果我想在整个项目中重新定义默认值,或者至少在整个py文件中重新定义默认值,那么有一种简单的方法吗?
例如read_csv()
默认为encoding=None
,但我希望每次调用read_csv()
默认为UTF-8
编码。
我知道我可以包装这个函数,但是通过一个单独的自定义导入让一个Pandas调用会觉得很难看。此外,其他开发人员无疑会回到使用read_csv()
。
我知道我可以编辑pandas源代码,但在保持兼容性方面这是一个非常糟糕的主意。
最后显然我可以更新每个read_csv()
调用以单独设置编码,但是我正在处理的项目中有很多这些调用,并且由于其他可选的非位置参数的可能性。这也无助于未来的开发人员重复同样的问题。
有什么想法吗?
修改
MedAli的答案适用于档案范围。
我一直试图让它在目录范围内工作(我正在使用Python 2.7):
我相信如果 pandas在标准库中,从标准库导入东西时很容易忽略本地文件:
from __future__ import absolute_import
这个相当狡猾的黑客行为也不起作用:
import sys
syspath = sys.path
new_syspath = [path for path in sys.path if path.strip('.')]
sys.path = new_syspath
import pandas
sys.path = syspath
我知道搞乱sys.path是一个坏主意,虽然因为我实际上是试图通过设计完全践踏熊猫,至少有一些常见的问题不适用。
另外,根据下面的评论 - 作为一个测试用例,在进行数百次搜索/替换之前,我认为找到一种方法来屏蔽库而不更改代码是有效的......如果它有效,那么使用一个不那么糟糕的解决方案。< / p>
它开始看起来不可行,即使使用黑客,任何人都可以证明我错了吗?
第二次编辑:
我很确定你在第一个编辑中不能做我所问过的事情,所以我已经接受了文件范围的答案,因为你可以用Python做的最好。
在进行测试运行方面,我认为最简单的方法是在应用文件范围级别修复之前暂时更改panadas中的parsers.py。
如果有人不这么认为我仍然感兴趣!
答案 0 :(得分:3)
您可以使用functools.partial
import pandas as pd
import functools
new_read_csv = functools.partial(pd.read_csv, encoding="utf-8")
然后您使用new_read_csv
,就像使用pd.read_csv
您还可以使用默认参数覆盖pd.read_csv
以保存新函数,如下所示:
pd.read_csv = new_read_csv
如果你想在覆盖之后回到原来的实现:
pd.read_csv = pd.read_csv.func