更改pandas函数中的默认参数调用

时间:2017-08-04 09:25:18

标签: python python-2.7 pandas python-import

在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。

如果有人不这么认为我仍然感兴趣!

1 个答案:

答案 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