【问题标题】:TypeError: worker() takes 0 positional arguments but 1 was givenTypeError: worker() 接受 0 个位置参数,但给出了 1 个
【发布时间】: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

【问题讨论】:

标签: python python-3.x


【解决方案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()

                  【讨论】:

                    猜你喜欢
                    • 2020-06-13
                    • 2017-10-05
                    • 2016-01-30
                    • 2019-06-26
                    • 2014-11-12
                    • 1970-01-01
                    • 2019-04-15
                    • 1970-01-01
                    相关资源
                    最近更新 更多