TypeError: worker () akzeptiert 0 Positionsargumente, aber 1 wurde angegeben

78

Ich versuche eine Unterklasse zu implementieren und es wird der Fehler ausgegeben:

TypeError: worker() takes 0 positional arguments but 1 was given

class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
    def GenerateAddressStrings(self):
        pass    
    def worker():
        pass
    def DownloadProc(self):
        pass
StatsViaCsh
quelle
Es gab eine Schiffsladung Code und Erklärungen, die völlig unabhängig von dem sehr einfachen Problem waren, das Sie hatten, und den Fehler versteckten. Ich habe den Überschuss für dich entfernt. catb.org/esr/faqs/smart-questions.html#volume
msw
1
Docstrings sind geschickt , alle coolen Kids benutzen sie.
Msw

Antworten:

135

Ihre workerMethode benötigt 'self' als Parameter, da es sich um eine Klassenmethode und nicht um eine Funktion handelt. Wenn Sie das hinzufügen, sollte es gut funktionieren.

Atra Azami
quelle
8
Als ich diesen Fehler zum ersten Mal sah, kratzte ich mich lange am Kopf. Aus meiner Erfahrung und Bestätigung durch Ihre Antwort konnte ich dann herausfinden, dass meine Klassenmethode mit 0 Argumenten zur Laufzeit mit dem Argument 'self' geliefert wurde, was mir diesen Fehler gab. Feinheiten von Python.
Deepak Pathak
24

Wenn die Methode kein selfArgument benötigt, können Sie den @staticmethodDekorator verwenden, um den Fehler zu vermeiden:

class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):

    def GenerateAddressStrings(self):
        pass    

    @staticmethod
    def worker():
        pass

    def DownloadProc(self):
        pass

Siehe https://docs.python.org/3/library/functions.html#staticmethod

LeilaHC
quelle
16

Sie haben vergessen, selfder Funktion worker()in der Klasse einen Parameter hinzuzufügen KeyStatisticCollection.

TerryA
quelle
8

Dies kann verwirrend sein, insbesondere wenn Sie der Methode kein Argument übergeben. Also, was gibt es?

Wenn Sie eine Methode für eine Klasse aufrufen (wie work()in diesem Fall), übergibt Python automatisch self als erstes Argument.

Lesen wir das noch einmal: Wenn Sie eine Methode für eine Klasse aufrufen (wie work()in diesem Fall), übergibt Python sich automatisch als erstes Argument

Hier sagt Python also, hey, ich kann sehen, dass work()0 Positionsargumente benötigt werden (weil Sie nichts in der Klammer haben), aber Sie wissen, dass das selfArgument beim Aufruf der Methode immer noch automatisch übergeben wird. Sie sollten dies also besser beheben und das selfSchlüsselwort wieder einfügen.

Das Hinzufügen selfsollte das Problem beheben.work(self)

class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
    pass    
def worker(self):
    pass
def DownloadProc(self):
    pass
Stryker
quelle
6
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
    pass    
def worker(self):
    pass
def DownloadProc(self):
    pass
Nitesh Sharma
quelle
8
Während dieser Code die Frage beantworten kann, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, seinen langfristigen Wert
Vishal Chhodwani
1

Überprüfen Sie, ob Sie von der Methode mit dem Namen method_a () eine Methode mit dem gleichen Namen method_a (with_params) aufrufen, die eine Rekursion verursacht

makkasi
quelle
0

Ein weiterer Anwendungsfall für diesen Fehler ist das Importieren von Funktionen innerhalb der Klassendefinition. Dadurch werden die nachfolgenden Funktionsaufrufe Teil des Klassenobjekts. In diesem Fall können Sie @staticmethod für die Bibliotheksimportfunktion verwenden oder einen statischen Pfadaufruf direkt an die Funktion senden. siehe Beispiel unten

In diesem Beispiel löst "self.bar ()" einen TypeError aus, der jedoch auf zwei Arten behoben werden kann

# in lib.py
def bar():
  print('something to do')

# in foo.py
class foo():
  from .lib import bar

  def __init__(self):
    self.bar()

Option 1:

# in lib.py
def bar():
  print('something to do')

# in foo.py
class foo():
  from .lib import bar

  def __init__(self):
    lib.bar()

Option 2:

# in lib.py:
@staticmethod
def bar():
  print('something to do')

# in foo.py
class foo():
  from .lib import bar

  def __init__(self):
    self.bar()
Roller
quelle
0

Bei der Flask Basic-Authentifizierung wurde dieser Fehler angezeigt, und dann wurde mir klar, dass ich wrap_view (** kwargs) hatte und es funktionierte, nachdem ich es in wrapped_view (* args, ** kwargs) geändert hatte.

Sai Pavani Nagisetti
quelle