2017-10-12 121 views
4

我已經閱讀了幾個類似問題的主題,但我不明白在我的情況下引發的錯誤。類方法需要1個位置參數,但有2個被給出

我有一類方法:

def submit_new_account_form(self, **credentials): 
... 

當我把它像這樣我的對象的實例:

create_new_account = loginpage.submit_new_account_form(
      {'first_name': 'Test', 'last_name': 'Test', 'phone_or_email': 
       temp_email, 'newpass': '1q2w3e4r5t', 
      'sex': 'male'}) 

我收到此錯誤:

line 22, in test_new_account_succes 
    'sex': 'male'}) 
TypeError: submit_new_account_form() takes 1 positional argument but 2 were  
given 
+0

你知道'** kwargs'的含義嗎? –

+0

請閱讀我對Reti43評論的評論 –

回答

5

好這是合乎邏輯的:**credentials意味着您將提供它名爲 a rguments。但是你不提供字典的名字。

這裏有兩種可能性:

  1. 您使用credentials作爲一個參數,並把它傳遞的字典,如:

    def submit_new_account_form(self, credentials): 
        # ... 
        pass 
    
    loginpage.submit_new_account_form({'first_name': 'Test', 'last_name': 'Test', 'phone_or_email': temp_email, 'newpass': '1q2w3e4r5t', 'sex': 'male'}) 
    
  2. 你把字典作爲命名的參數,由把兩個星號放在前面:

    def submit_new_account_form(self, **credentials): 
        # ... 
        pass 
    
    loginpage.submit_new_account_form(**{'first_name': 'Test', 'last_name': 'Test', 'phone_or_email': temp_email, 'newpass': '1q2w3e4r5t', 'sex': 'male'}) 
    

第二種方法是等於傳遞命名參數,如:

loginpage.submit_new_account_form(first_name='Test', last_name='Test', phone_or_email=temp_email, newpass='1q2w3e4r5t', sex='male') 

我認爲最後的方法來調用,這是更清晰的語法。此外,它允許您輕鬆修改函數簽名的簽名以立即捕獲某些參數,而不是將它們包裝到字典中。

+1

我同意。唯一一次,我將包裝在字典中的參數,如果他們的設置,我打算傳遞給多次函數,例如'plt.plot()' – Reti43

+1

我將在不同的自動化測試用例中使用此方法,不同的情況下(例如有或沒有參數)。因此,我決定使用這種方法來將可選參數 –

+0

@AkopAkopov:是的。當然可以有這樣的情況下,這可能是有益的:)。我只是說這通常應該是一個鐘聲,也許你讓事情變得複雜。這當然取決於具體的背景:)。 –

相關問題