2016-10-02 141 views
0

假設有下面的外部模塊和它闡明瞭這樣的:增加額外的價值kwarg列表

module1.py

X = [1,2,3] 

def test_func(keyword_list=X): 
    return keyword_list 

test_func() 

在另一個文件我想其他項目添加到在kwarg X會在哪裏做我的電話,這將是在這裏:

my_file.py

from module1 import test_func 

test_func() 
... 

有沒有什麼簡單的方法可以在我的第一次打電話給我的kwarg時添加額外的清單項目test_func。我知道,在技術上我可以像下面這樣:

from module1 import test_func, X 

test_func(keyword_list=X + [4]) 

[1,2,3,4] 

反正有沒有做到這一點,而不直接從module1.py進口X

編輯module1.py是我不能直接更改的開源模塊。

+0

爲什麼你甚至想這樣做呢?我的意思是,你想使用函數的默認值,添加一些東西,然後再調用它?就像你不知道默認值是怎麼樣的,對吧?所以我認爲這會是一種奇怪的行爲。也許如果你能給我更合理的例子,我可以幫助你,但現在我不確定你試圖通過這個來達到什麼目的。 – Nf4r

回答

0

好像一個解決辦法,使該方案將有你的test_func API需要兩個列表...

def test_func(user_keywords=None, default_keywords=X): 
    # merge them 
    # more stuff... 

我肯定有辦法反映了該方法,並得到使用默認ARGS inspect模塊和方法,如inspect.getargspec,但這似乎是一個麻煩,可以通過首先在方法簽名中容納預期用例來避免。

+0

如果您無法更改test_func,請查看inspect模塊以查找arg默認值。 –

1

使用另一個關鍵字ARG:

def test_func(keyword_list=[1,2,3,4], additional_list=[]): 
    return keyword_list + additional_list 

print(test_func()) 
print(test_func(additional_list=[5])) 

應該產生

[1, 2, 3, 4] 
[1, 2, 3, 4, 5] 

或者使用一個包裝函數:

def wrapper_test_func(additional_list=[]): 
    return test_func(module1.X + additional_list) 
+0

'test_func'來自我不能直接重寫的公共模塊。 – jimmyguestnow

+0

在我的答案中查看編輯 - 使用包裝函數,以便在每次調用中不必使用非優雅的東西 –