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

我有一些python代码,包含如下单元测试:

1
2
3
4
5
6
7
8
9
10
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)

但当我运行这个,我得到错误:

1
2
3
4
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有什么区别?


前面已经提到过,但是我的回答是"您的方法附近应该是静态的"。我不传递self,而是使用@staticmethod装饰器将方法设置为静态。这是给定的事实,通过自我没有任何好处。更重要的是,如果您将self作为参数传递,声纳Python Lint组合之类的质量检查器将把它标记为"应该是静态的"。这是我经常忘记的(Module function vs . staticmethod vs . classmethod vs . no decorator:哪种习惯用法更符合python风格?)

另外,我建议将margin作为一个变量传递,而不是像我现在想象的那样,将它作为一个全局变量。


任何类方法中的第一个变量都是对类实例的引用。您的方法期望有两个变量:val1val2,但是当您调用self.near(val1, val2)时,它相当于调用一个以selfval1val2作为参数的函数。

从Python文档的类,第二段:

the method function is declared with an explicit first argument
representing the object, which is provided implicitly by the call