2017-02-23 62 views
0

我正在嘗試使用* args來調用該方法的不同方法。以下是我的代碼片。瞭解TypeError:獲得關鍵字參數的多個值

def total(name, *args): 
    if args: 
     print("%s has total money of Rs %d/- " %(name, sum(args))) 
    else: 
     print("%s's piggy bank has no money" %name) 

現在有兩種方法可以調用此方法。一個是在*()內傳遞額外的參數或者用逗號直接分隔。我故意將param = value形式的'name'值傳遞給它,以致它引發錯誤。以下是兩種方法,我想: -

1 - 薪火額外參數逗號分隔: -

>>> total(name="Adi", 1, 2, 10) 
    File "<stdin>", line 1 
SyntaxError: non-keyword arg after keyword arg 

2 - 使用*()來傳遞額外參數: -

>>> total(name="Adi", *(1, 2, 10)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: total() got multiple values for keyword argument 'name' 

的第一個錯誤信息非常清楚,它表達了確切的錯誤。但是,我無法理解第二次調用的錯誤消息。

Python如何評估第二次調用它獲取參數'name'的多個值?即來到我的腦海的可能途徑是內部的Python會被翻譯

total(name="Adi", *(1, 2, 10))

如下: -

total(*(1, 2, 10), name="Adi")

在這上面的翻譯,因爲每個位置,「名」獲取價值*(1 ,2,10),然後再次獲得「阿迪」。因此可以理解多個值的錯誤。

但是,我不確定,python是否會在內部改變立場?任何關於此的見解都會有所幫助。

+0

'總(名稱 - 「阿迪」,1,2,10)'是無效的,因爲''''符號。你確定你向我們展示了真實的代碼嗎? –

+0

我的不好。是一個小姐。 –

回答

1

我檢查了使用inspect模塊的方法。來自inspect模塊的getcallargs()方法爲您提供了傳遞值到方法參數的映射。

def total(name, *args): 
    if args: 
     print("%s has total money of Rs %d/- " %(name, sum(args))) 
    else: 
     print("%s's piggy bank has no money" %name) 

#total(name="Adi", *(1, 2, 10)) 
# equivalent call using inspect module 
import inspect 
print inspect.getcallargs(total, 'Adi', *(1, 2, 10)) 

所以,當一個方法調用時,傳遞的所有參數變爲在以下任一兩種形式

*positional :- a tuple of all positional arguments (without keyword) and arguments passed within *() or the extra non-keyworded arguments

**named :- a dictionary of all the arguments passed in form of param=value, and extra keyworded arguments

所以在我的電話total(name="Adi", *(1, 2, 10))'positional'元組的值爲(1, 2,10)和'named'字典有價值{'name':'Adi'}

然後它將值賦值給參數。在分配過程中,首先分配強制參數。 Python會檢查強制參數列表(這裏是['name']),並依次賦值來自'positional'元組的值。任何來自元組的值都保留未賦值,被假定爲額外的參數(非密鑰參數)。

因此參數'name'獲得分配給它的值1。剩餘的值(即2和10)被假定爲額外的參數。

接下來,它會檢查該方法的簽名中是否包含非密鑰參數。如果是這樣,那麼將'positional'元組中的剩餘值分配給相同。所以這裏'args'被分配給剩下的值,即(2,10)的元組。

但是,如果在方法簽名中沒有非關鍵字參數,並且'positional'元組有一些值仍未分配,則python會拋出錯誤「方法需要X個參數Y給出」Y大於X.

一旦分配了'positional'的所有值,就會分配'named'字典中的值分配。在這種情況下,解釋器首先檢查字典中是否存在強制性參數,即在方法調用中是否以<param=value>的形式傳遞了任何強制性參數的值?如果是,那麼接下來會檢查在賦值'positional'元組期間是否已將任何值分配給這些強制參數?

如果是這樣,那麼它找到相同參數的兩個值(一個來自'positional',另一個來自'named'),因此會拋出"got multiple values for keyword argument"錯誤。否則,它將該值分配給'named'字典中的參數。

以這種方式,在上述情況下,自變量'name'是強制性參數,並且存在於'named'字典中,因爲我在方法調用中通過了name="Adi"。在分配位置值(來自'positional'元組的值)期間,變量'name'已經分配了值1。從命名參數字典(值從'named'字典),它的值爲'Adi',這使得2個值分配給變量'name'。因此,我們所得到的錯誤: -

total() got multiple values for keyword argument 'name'

因此,當通過非keyworded額外的參數,需要你只需要把這個值必須的參數,這將使它的位置。但是,不以<param=val>的形式,這將使其命名,並將獲得參數的兩個值,因此會拋出錯誤。因此不建議以<param = value >的形式通過必要的參數。

因此正確的方式來調用該方法包括: -

total('Adi', *(1,2,10))

total('Adi', 1, 2, 10)

相關問題