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个参数?


你忘了在near功能时通过self

def near(self, val1, val2):

@classmethod和@staticmethod对初学者的意义?

Python中@staticmethod和@classmethod有什么区别?


任何类方法中的第一个变量是对类实例的引用。 你的方法需要两个变量: val1val2 ,但是当你调用self.near(val1, val2)它相当于使用selfval1val2作为参数来调用一个函数。

从Python的Docs on Classes,第二段:

该方法函数声明了一个显式的第一个参数来表示该对象,该对象由该调用隐式提供


之前已经提到过,但我的答案是“你的方法应该是静态的”。 而不是传递自我,我会使用@staticmethod装饰器使该方法成为静态的。 这是因为通过自我没有好处。 更重要的是,如果您将自己作为参数传递,像Sonar Python Lint组合这样的质量检查器会将其标记为“它应该是静态的”。 这是我经常忘记的事情(模块函数vs静态方法vs类方法vs没有装饰器:哪种习语更pythonic?)。

此外,我会建议将margin作为变量来使用,而不是将其作为我想像的全局变量。

链接地址: http://www.djcxy.com/p/54279.html

上一篇: Python saying I'm passing in too many parameters to my function?

下一篇: function as class attribute becomes a bound method