TypeError:worker()接受0个位置参数,但给出了1个


78

我正在尝试实现一个子类,它引发错误:

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
城市生活垃圾

1
Docstrings很漂亮,所有很酷的孩子都在使用它们。
msw

Answers:


136

您的worker方法需要“自我”作为参数,因为它是类方法而不是函数。添加它应该可以正常工作。


8
第一次看到该错误时,我挠了很久。然后根据我的经验和您的回答确认,可以确定在运行时为我的带有0个参数的类方法提供了'self'参数,这给了我这个错误。python的复杂性。
Deepak Pathak


16

您忘记了将self参数作为参数添加到worker()类中的函数KeyStatisticCollection


8

这可能会造成混乱,尤其是当您不向该方法传递任何参数时。那有什么呢?

当您在类上调用方法时(例如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身份验证时,出现了此错误,然后我意识到我拥有wrapd_view(** kwargs),并且在将其更改为wrapd_view(* args,** kwargs)后可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.