Python说我向我的函数传递了太多参数?
Python说我向我的函数传递了太多参数?
我有一些包含单元测试的Python代码,如下所示:
class SunCalcTestCases(unittest.TestCase): """Tests for `suncalc.py`.""" def near(val1, val2): return abs(val1 - val2) < (margin or 1E-15) def test_getPositions(self): """Get sun positions correctly""" sunPos = suncalc.getPosition(self.date, self.lat, self.lng) az = sunPos["azimuth"] res = self.near(az, -2.5003175907168385)
但当我运行这个代码时,我收到了错误信息:
Traceback (most recent call last): File "test.py", line 64, in test_getPositions res = self.near(az, -2.5003175907168385) TypeError: near() takes exactly 2 arguments (3 given)
我对Python还不太熟悉,所以如果我漏掉了什么,请谅解,但据我所知,当我调用函数时,我只传入了两个参数:self.near(az, -2.5003175907168385)
有人可以告诉我为什么它认为我传入了3个参数吗?
在上述问题中,出现了“Python saying I'm passing in too many parameters to my function”的错误。这个错误的原因是方法的第一个变量是对类实例的引用。在这个例子中,方法期望两个变量val1
和val2
,但是当调用self.near(val1, val2)
时,实际上相当于用self
、val1
和val2
作为参数调用函数。
根据Python文档中关于类的部分的说明,方法函数声明时需要显式地声明第一个参数,该参数表示对象,而在调用时会隐式地提供。
解决这个问题的方法是,在定义方法时将第一个参数self
加入到参数列表中,并在调用时省略这个参数。这样就可以保证方法正常运行,不再报错。
下面是修正后的代码:
class MyClass: def near(self, val1, val2): # method logic here my_instance = MyClass() my_instance.near(val1, val2)
通过这样的修正,near
方法将能够正常运行,不再报告参数过多的错误。
在Python中,类的方法有三种类型:实例方法、类方法和静态方法。在实例方法中,必须显示地传递self作为第一个参数,表示该方法是与实例对象相关联的。然而,在某些情况下,可能会忘记在函数中传递self参数,导致出现错误提示"Python saying I'm passing in too many parameters to my function"。
解决这个问题的方法是在函数定义中添加self参数,并确保在调用函数时传递正确的参数数量。以下是一个示例代码:
class MyClass: def near(self, val1, val2): # do something with val1 and val2 obj = MyClass() obj.near(1, 2)
在这个示例中,我们创建了一个名为MyClass的类,并定义了一个名为near的实例方法。在这个方法中,我们没有使用self参数,但是在函数定义中我们仍然需要将self作为参数传递进去。
这个问题的原因是忘记了在near函数中传递self参数。self参数是用来传递实例对象的引用,使得方法能够访问实例对象的属性和方法。
为了解决这个问题,我们需要在函数定义中添加self参数,并在调用函数时传递正确的参数数量。这样,Python就能正确地识别方法与实例对象的关联,避免出现"Python saying I'm passing in too many parameters to my function"的错误提示。
在Python中,self参数约定俗成的用法,并且在大多数情况下必须使用。它是Python的一种语法约定,用来指示方法与实例对象的关联。通过使用self参数,我们可以在方法中访问实例对象的属性和方法,使得类的方法能够正确地执行其功能。
总结起来,为了避免出现"Python saying I'm passing in too many parameters to my function"的错误提示,我们需要在类的实例方法中添加self参数,并在调用方法时传递正确的参数数量。这样,Python就能正确地识别方法与实例对象的关联,确保方法能够正确执行其功能。
问题原因:函数参数过多,导致传入参数过多。
解决方法:将方法声明为静态方法,并使用装饰器来实现。这样做的好处是不需要传入self参数。此外,如果传入self作为参数,像Sonar Python Lint这样的质量检查工具会标记为“应该是静态方法”。这是我经常忽略的一点。另外,我建议将margin作为变量传入,而不是将其作为全局变量。
代码示例:
@staticmethod def your_method_near(): # method code here pass margin = 10 your_method_near(margin)
以上是关于Python函数参数过多的问题出现的原因以及解决方法。通过将方法声明为静态方法并使用装饰器来实现,可以避免传入过多的参数。此外,建议将margin作为变量传入,而不是将其作为全局变量。