2017-08-04 97 views
0

在熊貓中,許多函數都帶有一長串可選參數,每個參數都有一個默認參數。在熊貓函數調用中更改默認參數

如果我想在整個項目中重新定義一個默認值,或者至少在整個py文件中有一個簡單的方法來做到這一點?

例如read_csv()默認爲encoding=None,但我希望每個呼叫read_csv()默認爲UTF-8編碼。

我承認我可以包裝這個功能,但是這個感覺很難看,因爲有一個熊貓電話通過單獨的自定義導入。再加上其他開發人員無疑會回到使用read_csv()

我知道我可以編輯熊貓源代碼,但在維護兼容性方面這是一個非常糟糕的主意。

最後,顯然我可以更新每個read_csv()調用來單獨設置編碼,但是我正在處理的項目中有很多這樣的調用,並且由於其他可能性可選的非定位參數。這也不利於未來的開發人員重複相同的問題。

任何想法?

編輯:

MedAli的回答運作良好,在文件範圍內。

我堅持好一會纔在目錄範圍內的工作(我使用Python 2.7):

我相信,如果大熊貓在標準庫這將是很容易忽視本地從標準庫中導入的事情,當文件: 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 

我理解MES用sys.path唱歌是一個壞主意,雖然因爲我實際上試圖通過設計來完全踐踏大熊貓,但至少有一些通常的擔憂並不適用。

根據下面的註釋加上 - 作爲一個測試用例之前,使數百個搜索/替換我認爲這是有效的找到一種方法來掩蓋圖書館而無需更改代碼...如果它的工作,然後採用一個較少hacky的解決方案。

它開始看起來不可行,即使使用黑客,任何人都可以證明我錯了嗎?

2日編輯:

我相當肯定你不能做什麼,我問了一下在第一編輯,所以我接受了文件範圍的答案,你可以在Python中做到最好。

在進行測試運行方面,我認爲最簡單的做法是在應用文件範圍級別修正之前臨時更改panadas中的parsers.py。

如果有人認爲不然,我仍然感興趣!

+3

沒有防呆的方法無法解決。我只是定義了你自己的包裝器,並且讓它知道它將'encoding'參數默認設置爲'utf-8',並將其保留。 – EdChum

回答

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 
+0

這真的很不錯 - 但它缺少最後一點 - 它會以某種方式將它重新疊加到pd.read_csv上,隱藏原始實現(至少在某種程度上),而不是創建一個新函數。 – Phil

+1

@Phil檢查我的更新答案。 – MedAli

+0

謝謝 - 是的,這完全適用於文件範圍。無論如何要讓它在目錄範圍甚至項目範圍內工作嗎?我正在探索使用導入陰影,在本地源代碼目錄中有一個pandas.py,它將覆蓋實際的pandas導入。然後,它會將所有實際的熊貓導入它自己的命名空間,並像您所顯示的那樣修改read_csv?它似乎沒有工作壽,也許是因爲它很hacky!陰影的作品,但我看不出如何用實際的熊貓命名空間填充本地熊貓命名空間? – Phil