2017-10-12 5 views
4

Ich habe mehrere Themen mit ähnlichen Problem gelesen, aber ich verstehe nicht, der Fehler wird in meinem Fall geworfen.Klassenmethode dauert 1 Positionsargument aber 2 wurden gegeben

Ich habe eine Klasse-Methode:

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

Wenn ich es auf einer Instanz von meinem Objekt wie folgt nennen:

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

erhalte ich diesen Fehler:

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

Wissen Sie, was '** kwargs' bedeutet? –

+0

Bitte lesen Sie meinen Kommentar unter Reti43's Kommentar –

Antwort

5

Well das ist logisch: **credentials bedeutet, dass Sie es mit dem Namen a bereitstellen werden rgumente. Sie geben jedoch keinen Namen für das Wörterbuch an.

Es gibt zwei Möglichkeiten:

  1. Sie credentials als ein einziges Argument verwenden, und es das Wörterbuch übergeben, wie:

    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. Sie das Wörterbuch als benannte Argumente übergeben, durch Setzen Sie zwei Sterne vor:

    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'}) 
    

Der zweite Ansatz ist gleich benannten Argumente zu übergeben, wie:

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

Ich denke, die letzte Möglichkeit, dies zu rufen saubere Syntax ist. Darüber hinaus können Sie die Signatur der Funktionssignatur submit_new_account_form einfach ändern, um bestimmte Parameter sofort zu erfassen, anstatt sie in ein Wörterbuch einzufügen.

+1

Ich stimme zu. Die einzige Zeit, die ich die Argumente in einem Wörterbuch verpacken würde, wenn sie Einstellungen zu etwas sind, das ich zu Funktionen mehrmals übergäbe, zB in 'plt.plot() ' – Reti43

+1

Ich werde diese Methode in verschiedenen automatisierten Testfällen verwenden, in verschiedene Fälle (zB mit oder ohne Argumente). Deshalb habe ich mich dafür entschieden, einen solchen Ansatz zu verwenden, um dort optionale Argumente zu setzen –

+0

@AkopAkopov: ja. Sicher kann es Umstände wie diese geben, wo es nützlich sein kann :). Ich sage nur, dass das normalerweise eine Glocke läuten sollte, dass Sie vielleicht Dinge zu kompliziert machen. Das hängt natürlich vom spezifischen Kontext ab :). –

Verwandte Themen