TypeError:worker()获取0个位置参数但给出了1

时间:2013-09-19 01:10:07

标签: python python-3.x

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

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

10 个答案:

答案 0 :(得分:86)

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

答案 1 :(得分:14)

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

答案 2 :(得分:11)

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

答案 3 :(得分:9)

尤其是当您没有将任何参数传递给方法时,这可能会造成混淆。那有什么呢?

当您在类(例如 plt.plot(x, y1) plt.show() )上调用方法时,Python 自动 将self作为第一个参数传递。

让我们再读一次: 当您在类(例如URIBuilder authorizationURI = new URIBuilder("http://localhost:8180/auth/realms/application_name/protocol/openid-connect/token"); WebClient webclient = WebClient.builder().build(); MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(); formData.put("grant_type", Collections.singletonList("client_credentials")); formData.put("client_id", Collections.singletonList("application_name")); formData.put("client_secret", Collections.singletonList("tralala-5d0e-4bea-938b-884c1ce4c981")); )上调用方法时,Python自动 传递self作为第一个参数

因此Python在这里说,嘿,我可以看到work()接受0个位置参数(因为括号内没有任何内容),但是您知道work()参数仍在传递自动。因此,您最好修复此问题,然后再将work()关键字放回去。

添加self应该可以解决此问题。 self

self

答案 4 :(得分:4)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

每当我错误地使用 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

糟糕!

答案 7 :(得分:1)

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

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

答案 8 :(得分: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()

答案 9 :(得分:0)

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