2013-05-16 43 views
6

假設我有一個函數get_data,它需要一些關鍵字參數。有沒有一些方法,我可以做到這一點在函數調用和定義中使用** kwargs

def get_data(arg1, **kwargs): 
    print arg1, arg2, arg3, arg4 

arg1 = 1 
data['arg2'] = 2 
data['arg3'] = 3 
data['arg4'] = 4 

get_data(arg1, **data) 

這樣的想法是爲了避免在這兩個函數調用和函數定義的輸入參數的名稱。我用字典作爲參數調用該函數,並且字典的鍵變成函數的局部變量,它們的值是字典值

我試過上面的錯誤,說錯了,說的是global name 'arg2' is not defined。我知道我可以更改get_data的定義中的locals()以獲得所需的行爲。

所以我的代碼看起來像這樣

def get_data(arg1, kwargs): 
    locals().update(kwargs) 
    print arg1, arg2, arg3, arg4 

arg1 = 1 
data['arg2'] = 2 
data['arg3'] = 3 
data['arg4'] = 4 

get_data(arg1, data) 

,它不會太工作。也不能不使用locals()實現行爲?

+0

我建議你檢查出這個問題http://stackoverflow.com/questions/3394835/args-and-kwargs –

+2

不要修改'locals' ,它甚至不保證一直工作:http://docs.python.org/2/library/functions.html#locals – jamylak

+1

..爲什麼你會這麼做?如果你知道arg2,arg3,arg4總是那麼你應該將它們指定爲單獨的參數,如果你不這樣做,那麼即使你有所需的行爲,只要你引用'arg4'時'data'沒有定義'arg4',它會引發一個NameError,它甚至不會打印任何數據,只會引發錯誤。 – kampu

回答

11

**kwargs是一個普通的字典。試試這個:

def get_data(arg1, **kwargs): 
    print arg1, kwargs['arg2'], kwargs['arg3'], kwargs['arg4'] 

另外,檢查文檔keyword arguments

3

如果我們檢查一下你的例子:

def get_data(arg1, **kwargs): 
    print arg1, arg2, arg3, arg4 

在你get_data功能的命名空間,有一個名爲arg1變量,但沒有名爲arg2變量。所以你不能訪問不在你的名字空間中的函數或變量。

其實在你的命名空間裏;有一個變量arg1和一個叫做kwargs的對象dictionary。在kwargs之前使用**表示法(名字kwargs在這裏不重要,它可以是別的。)告訴你的python編譯器kwargs是一個字典,並且該字典中的所有值都將在函數定義中作爲命名參數進行計算。

讓我們來看看這個例子:

def myFunc(**kwargs): 
    do something 

myFunc(key1='mykey', key2=2) 

,當你調用myFunc與命名參數key1key2,你的函數定義的行爲像

def myFunc(key1=None, key2=None): 

有一個例外!由於myFunc沒有命名參數,編譯器不知道如何直接處理它們,因爲您可以將任何命名參數傳遞給您的函數。

所以你的函數接受一個字典中的命名參數,比如你打電話功能:

myFunc({key1:'mykey', key2:2}) 

所以,你的函數定義買到字典中的那些參數。**kwargs定義你在這一點上的字典,這也告訴任何命名參數將(在kwargs之前的**跡象的幫助)接受編譯

def myFunc(**kwargs): 
    print kwargs 

將打印

{key1:'mykey', key2:2} 

所以,在你的榜樣,你可以像字典一樣使用kwargs;

def myFunc(**kwargs): 
    kwargs['arg2'] 
    kwargs.get('arg3') 

我希望這並不複雜(:

相關問題