类方法采用1个位置参数,但给出了2个

时间:2017-10-12 15:38:56

标签: python selenium dictionary kwargs

我已经阅读了几个有类似问题的主题,但我不明白错误是在我的情况下引起的。

我有一个班级方法:

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

1 个答案:

答案 0 :(得分:6)

这是合乎逻辑的:**credentials表示您将提供名为的参数。但是你没有提供字典的名称。

这里有两种可能性:

  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'})
    
  3. 第二种方法等同于传递命名参数,如:

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

    我认为调用它的最后一种方法是更清晰的语法。此外,它允许您轻松修改submit_new_account_form函数签名的签名,以立即捕获某些参数,而不是将它们包装到字典中。