Python说我向我的函数传递了太多参数?

时间:2015-07-21 05:41:21

标签: python python-2.7

我有一些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个参数?

3 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

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

来自Python Docs on Classes,第二段:

  

使用显式的第一个参数声明方法函数   表示对象,由调用

隐式提供

答案 2 :(得分:1)

之前已经提到但我的回答是&#34;你的方法应该是静态的&#34;。 我不是传递self,而是使用@staticmethod装饰器使方法静态化。这是因为传递自我没有任何好处。更重要的是,如果你将自己作为一个参数传递,像Sonar Python Lint组合这样的质量检查器会将其标记为&#34;它应该是静态的&#34;。这是我经常忘记的事情(Module function vs staticmethod vs classmethod vs no decorators: Which idiom is more pythonic?)。

另外,我建议将margin作为变量传递,而不是将它作为一个全局变量,我想这是目前的。