更改 pandas 函数调用中的默认参数
Changing Default Parameter in pandas function call
在 pandas 中,许多函数采用一长串可选参数,每个参数都有一个默认值。
如果我想在整个项目或至少在整个 py 文件中重新定义默认值,有没有简单的方法可以做到这一点?
例如 read_csv()
默认为 encoding=None
,但我希望每次调用 read_csv()
都默认为 UTF-8
编码。
我知道我可以包装这个函数,但是通过单独的自定义导入进行一个 Pandas 调用感觉很难看。加上其他开发人员无疑会回到使用 read_csv()
.
我知道我可以编辑 pandas 源代码,但就保持兼容性而言,这是一个非常糟糕的主意。
最后显然我可以更新每个 read_csv()
调用以单独设置编码,但在我正在处理的项目中有非常多的编码,正则表达式会很棘手,由于其他可选的非位置参数的可能性。此外,这无助于让未来的开发人员重复同样的问题。
有什么想法吗?
编辑:
MedAli 的答案在文件范围内运行良好。
我一直试图让它在目录范围内工作(我正在使用 Python 2.7):
我相信 if pandas 在标准库中,从标准库导入内容时忽略本地文件很容易:
from __future__ import absolute_import
此外,这个看起来很狡猾的 hack 也不起作用:
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 是个坏主意,虽然因为我实际上是在设计时试图完全践踏 pandas,至少一些常见的担忧不适用.
加上下面的评论 - 作为制作数百个之前的测试用例 search/replaces 我认为找到一种方法来屏蔽库而不更改代码是有效的......如果它有效然后使用更少骇人听闻的解决方案。
它开始看起来不可行,即使使用 hack,任何人都可以证明我错了吗?
第二次编辑:
我相当确定你不能做我在第一次编辑中问过的事情,所以我接受了文件范围的答案作为你在 Python.[=19= 中可以做的最好的答案]
就测试 运行 而言,我认为最简单的做法是在应用文件范围级别修复之前临时更改 panadas 中的 parsers.py。
如果有人不这么认为,我仍然很感兴趣!
您可以使用 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
在 pandas 中,许多函数采用一长串可选参数,每个参数都有一个默认值。
如果我想在整个项目或至少在整个 py 文件中重新定义默认值,有没有简单的方法可以做到这一点?
例如 read_csv()
默认为 encoding=None
,但我希望每次调用 read_csv()
都默认为 UTF-8
编码。
我知道我可以包装这个函数,但是通过单独的自定义导入进行一个 Pandas 调用感觉很难看。加上其他开发人员无疑会回到使用 read_csv()
.
我知道我可以编辑 pandas 源代码,但就保持兼容性而言,这是一个非常糟糕的主意。
最后显然我可以更新每个 read_csv()
调用以单独设置编码,但在我正在处理的项目中有非常多的编码,正则表达式会很棘手,由于其他可选的非位置参数的可能性。此外,这无助于让未来的开发人员重复同样的问题。
有什么想法吗?
编辑:
MedAli 的答案在文件范围内运行良好。
我一直试图让它在目录范围内工作(我正在使用 Python 2.7):
我相信 if pandas 在标准库中,从标准库导入内容时忽略本地文件很容易:
from __future__ import absolute_import
此外,这个看起来很狡猾的 hack 也不起作用:
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 是个坏主意,虽然因为我实际上是在设计时试图完全践踏 pandas,至少一些常见的担忧不适用.
加上下面的评论 - 作为制作数百个之前的测试用例 search/replaces 我认为找到一种方法来屏蔽库而不更改代码是有效的......如果它有效然后使用更少骇人听闻的解决方案。
它开始看起来不可行,即使使用 hack,任何人都可以证明我错了吗?
第二次编辑:
我相当确定你不能做我在第一次编辑中问过的事情,所以我接受了文件范围的答案作为你在 Python.[=19= 中可以做的最好的答案]
就测试 运行 而言,我认为最简单的做法是在应用文件范围级别修复之前临时更改 panadas 中的 parsers.py。
如果有人不这么认为,我仍然很感兴趣!
您可以使用 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