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

Posted

技术标签:

【中文标题】TypeError: worker() 接受 0 个位置参数,但给出了 1 个【英文标题】:TypeError: worker() takes 0 positional arguments but 1 was given 【发布时间】:2013-09-23 22:53:16 【问题描述】:

我正在尝试实现一个子类,但它会抛出错误:

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 Docstrings are nifty,所有酷孩子都在使用它们。 TypeError: method() takes 1 positional argument but 2 were given的可能重复 【参考方案1】:
 class KeyStatisticCollection():
     def GenerateAddressStrings(self):
         pass
     def worker():
         return blabla
     def DownloadProc(self):
         abc = self.GenerateAddressStrings()
         #abc = GenerateAddressStrings()#error
     blabla = worker()
     #blabla = self.worker()#error

我认为这是关于使用自我参数的更好解释

【讨论】:

【参考方案2】:

只需在 def worker(): 函数中传递 self 关键字

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

【讨论】:

【参考方案3】:

每当我错误地使用 def 而不是 class 创建 Python 类时,我都会收到此错误:

def Foo():
    def __init__(self, x):
        self.x = x
# python thinks we're calling a function Foo which takes 0 args   
a = Foo(x) 

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

哎呀!

【讨论】:

【参考方案4】:

在进行 Flask Basic 身份验证时,我遇到了这个错误,然后我意识到我有 Wrapped_view(**kwargs) 并且在将其更改为 Wrapped_view(*args, **kwargs) 后它就可以工作了。

【讨论】:

【参考方案5】:

这可能会令人困惑,尤其是当您没有将任何参数传递给方法时。那么是什么给出的呢?

当您调用类的方法时(例如本例中的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】:

此错误的另一个用例是在类定义中导入函数。这使得后续函数调用成为类对象的一部分。在这种情况下,您可以在库导入函数上使用 @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()

【讨论】:

【参考方案7】:

检查是否从名为 method_a() 的方法中调用了具有相同名称的方法 method_a(with_params) 导致递归

【讨论】:

【参考方案8】:
class KeyStatisticCollection(DataDownloadUtilities.DataDownloadCollection):
def GenerateAddressStrings(self):
    pass    
def worker(self):
    pass
def DownloadProc(self):
    pass

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值【参考方案9】:

如果该方法不需要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

【讨论】:

【参考方案10】:

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

【讨论】:

第一次看到那个错误,挠了很久。然后根据我的经验和您的回答的确认,能够确定我的具有 0 个参数的类方法在运行时提供了 'self' 参数,这给了我这个错误。 python的复杂性。 8 年后仍然相关,哈哈。我真的为此挠头。谢谢!【参考方案11】:

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

【讨论】:

以上是关于TypeError: worker() 接受 0 个位置参数,但给出了 1 个的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:get_weather()不接受任何参数(给定1个)[关闭]

Master 接受其它组件的注册

TypeError: _transform() 接受 2 个位置参数,但给出了 3 个

TypeError: forward() 接受 2 个位置参数,但给出了 3 个

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

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