Помилка типу: worker () приймає 0 позиційних аргументів, але 1 був заданий


80

Я намагаюся реалізувати підклас, і він видає помилку:

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

Було завантажено код і пояснення, які абсолютно не були пов’язані з дуже простою проблемою, яку ви мали, і приховували помилку. Я видалив надлишок для вас. catb.org/esr/faqs/smart-questions.html#volume
msw

1
Доктринг є витонченим , усі класні діти ними користуються.
msw

Відповіді:


141

Ваш worker метод для методу потрібне "self", оскільки це метод класу, а не функція. Додавши це, це має змусити працювати нормально.


8
Вперше побачивши цю помилку, я довго чухав голову. Тоді з мого досвіду та підтвердження вашої відповіді вдалося зрозуміти, що мій метод класу з 0 аргументами під час виконання був забезпечений аргументом "self", що дало мені цю помилку. Хитросплетіння пітона.
Deepak Pathak

25

Якщо метод не вимагає selfв якості аргументу, ви можете використовувати @staticmethodдекоратор, щоб уникнути помилки:

class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):

    def GenerateAddressStrings(self):
        pass    

    @staticmethod
    def worker():
        pass

    def DownloadProc(self):
        pass

Див. Https://docs.python.org/3/library/functions.html#staticmethod



9

Це може заплутати, особливо коли ви не передаєте будь-який аргумент методу. То що дає?

Коли ви викликаєте метод у класі (наприклад, work()у цьому випадку), Python автоматично передає self як перший аргумент.

Давайте ще раз прочитаємо це: Коли ви викликаєте метод у класі (наприклад, work()у цьому випадку), Python автоматично передає self як перший аргумент

Отже, тут Python каже, ей, я бачу, що work()приймає 0 позиційних аргументів (оскільки у вас немає нічого всередині дужок), але ви знаєте, що selfаргумент все ще передається автоматично, коли метод викликається. Тож краще виправте це і поставте теself ключове слово назад.

Додавання selfмає вирішити проблему.work(self)

class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
    pass    
def worker(self):
    pass
def DownloadProc(self):
    pass

6
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
    pass    
def worker(self):
    pass
def DownloadProc(self):
    pass

8
Хоча цей код може відповісти на запитання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокову цінність
Vishal Chhodwani

1

Перевірте, чи з методу з іменем method_a () ви викликаєте метод з тим самим іменем method_a (with_params), що викликає рекурсію


0

інший варіант використання цієї помилки - це імпорт функцій у визначенні класу. це робить наступні виклики функції частиною об’єкта класу. У цьому випадку ви можете використовувати @staticmethod у функції імпорту бібліотеки або здійснити виклик статичного шляху безпосередньо до функції. див. приклад нижче

У цьому прикладі "self.bar ()" видасть помилку TypeError, але її можна виправити двома способами

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

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

  def __init__(self):
    self.bar()

Варіант 1:

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

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

  def __init__(self):
    lib.bar()

Варіант 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()

0

При виконанні Flask Basic auth я отримав цю помилку, а потім зрозумів, що мав wrapped_view (** kwargs), і він спрацював після зміни його на wrapped_view (* args, ** kwargs).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.