TypeError : 方法只需要 2 个参数(给定 3 个)

Posted

技术标签:

【中文标题】TypeError : 方法只需要 2 个参数(给定 3 个)【英文标题】:TypeError : Method takes exactly 2 arguments (3 given) 【发布时间】:2014-03-16 12:47:28 【问题描述】:

尝试使用 pyudev 制作一个程序来监控 USB 驱动器的连接。代码如下:

def __init__(self):
    self.window = gtk.Window()
    self.window.set_default_size(300, 300)

    self.vbox= gtk.VBox(False, 5)
    label = gtk.Label("Please plug the device")

    context = Context()
    monitor = Monitor.from_netlink(context)
    monitor.filter_by(subsystem='block',device_type='disk')
    observer = GUDevMonitorObserver(monitor)
    observer.connect("device-added",self.device_connected)
    monitor.start()

    self.vbox.pack_start(label)
    self.window.add(self.vbox)

    self.window.show_all()

def device_connected(self, device):
    self.window.remove(self.vbox)
    label = gtk.Label('0!r added'.format(device))
    self.vbox.pack_end(label)
    self.window.add(self.vbox)

回溯:

vineet@vineet:~/Documents/Project$ python project.py
TypeError: device_connected() takes exactly 2 arguments (3 given)
TypeError: device_connected() takes exactly 2 arguments (3 given)

请帮我纠正这个问题。

我正在尝试使用docs 页面上给出的代码。您会注意到,device_connected 方法具有参数 - device_connected(observer,device),但代码在这种情况下也不起作用。它返回抛出相同的错误。但我想知道它首先会如何工作。不是每个类的方法都应该有self 作为参数吗?

【问题讨论】:

【参考方案1】:

文档没有说这些是该类的方法,而是该类发送的信号。 (事实上​​,文档使用的名称是“设备添加”,这在 Python 中甚至不是一个有效的函数名称。)

该函数应该是一个独立的函数,您将其注册为该信号的侦听器。您可以在页面顶部的代码 sn-p 中看到如何将信号连接到观察者的示例。

【讨论】:

哦,是的!但是,如果函数不是类的一部分,我该如何更改 self.window?如果我要让函数成为类的一部分,我该如何解决参数问题? 在我将函数设为独立函数后运行程序,同时将所有与监视器相关的代码从类中拉出,会引发错误:observer.connect("device-added",device_connected) NameError: name 'device_connected' is not defined 好的,上面的问题似乎已经解决了。将方法声明放在observer.connect 之前就可以了。

以上是关于TypeError : 方法只需要 2 个参数(给定 3 个)的主要内容,如果未能解决你的问题,请参考以下文章

初始化 kivy 屏幕时遇到困难,TypeError: __init__() 需要 1 个位置参数,但给出了 2 个

TypeError:str()最多使用1个参数(给定2个,TypeError:需要一个整数)

无法将 kwargs 传递给 Kivy 中的子类——TypeError: object.__init__() 只采用一个参数(要初始化的实例)

类型错误:generate_purchase_order() 只需要 1 个参数(给定 5 个)

如何修复“TypeError:fit_transform() 需要 2 个位置参数,但给出了 3 个”

TypeError save() 至少需要 2 个非关键字参数(给定 1 个)