Method() 接受 3 个位置参数,但给出了 4 个

Posted

技术标签:

【中文标题】Method() 接受 3 个位置参数,但给出了 4 个【英文标题】:Method() takes 3 positional arguments but 4 were given 【发布时间】:2017-05-30 08:22:58 【问题描述】:

早上好,我的一个脚本有问题,这是我的一位同事制作的。

重点是有一个包装驱动程序,它扩展了python的一些可用性,其中我们有一些方法可以使鼠标悬停操作更容易,还有一些其他功能,我们有类似的东西

Class SuperDriver: 
    def __init__(self, driver: object) -> object:
        self._driver = driver

    def wait_and_get(self, mode, key):
        return WebDriverWait(self._driver, self.WAIT_TIMEOUT).until(EC.visibility_of_element_located((mode, key)))

    def wait_and_move_to(self, mode, id):
        elem = self.wait_and_get(self._driver, mode, id)
        ActionChains(self._driver).move_to_element(elem).perform()

当我尝试在另一个脚本中使用它时,我会选择

from utils.super_driver.SuperDriver import SuperDriver

Class class1:
      def class1_test(self):

          sd1 = Superdriver(driver)

          sd1.wait_and_move_to(driver, By.XPATH, xpath)

然后它说

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

我试过了

   sd1.wait_and_move_to(By.XPATH, xpath)

这次说

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

   sd1.wait_and_move_to(xpath)

这导致

TypeError:wait_and_move_to() 缺少 1 个必需的位置参数:'id'

   sd1.wait_and_move_to(self, By.XPATH, xpath)

这导致了

TypeError:wait_and_move_to() 缺少 1 个必需的位置参数:'id'

我想到的任何事情,但没有任何效果,因此,我们将不胜感激。

谢谢!

【问题讨论】:

@Andersson 尝试思考而不是偶然编程怎么样? wait_and_move_to() 采用隐式 self 和 2 个参数,因此您的第一个示例是正确的。但是,您在wait_and_move_to() 中的调用self.wait_and_get(self._driver, mode, id) 有一个额外的参数,只需要self.wait_and_get(mode, id) “我已经尝试过(...)任何我想到的东西”:这不是你要学习的方式。尝试了解错误消息和代码(以及您使用的语言)是一个更好的策略......此外,第二个调用示例 (sd1.wait_and_move_to(By.XPATH, xpath)) 不会导致您发布的错误消息,并且“没有任何效果" 是对问题最无用的描述。 @brunodesthuilliers 在wait_and_move_to() 中有一个调用有太多参数,所以确实引发了相同的异常,但来自不同的行。 @brunodesthuilliers 我已经用其余的错误编辑了这个问题,我一直在尝试,因为我是 Python 的新手,而且理解一些东西有点困难 【参考方案1】:

正确的调用是:

sd1.wait_and_move_to(By.XPATH, xpath)

对象sd1作为第一个参数被隐式传递并在方法def wait_and_move_to(self, mode, id):中变为self

但是,如果您要查看异常的行号,您会看到 TypeError 是从这里抛出的:

def wait_and_move_to(self, mode, id):
    elem = self.wait_and_get(self._driver, mode, id)
                             ^^^^^^^^^^^^

正确的调用是:

def wait_and_move_to(self, mode, id):
    elem = self.wait_and_get(mode, id)
    ...

【讨论】:

不客气。请花一些时间了解正在发生的事情,长期猜测解决方案不会有成效。

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

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

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

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

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

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

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