2015-07-21 4 views
2

У меня есть питон код, который содержит модульные тесты, как показано ниже: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

'def near (self, val1, val2):' – LittleQ

ответ

5

Вы забыли передать self в near функции

def near(self, val1, val2):

Meaning of @classmethod and @staticmethod for beginner?

What is the difference between @staticmethod and @classmethod in Python?

+0

О, это, наверное, глупый вопрос, но почему я должен передавать 'self' в мою ближайшую функцию, если я не ссылаюсь на него? –

+3

@AbeMiessler [refer] (http://stackoverflow.com/questions/2709821/what-is-the-purpose-of-self-in-python) –

+0

Существует три типа метода класса-класса python. @AbeMiessler https://docs.python.org/2/faq/design.html#why-must-self-be-used-explicitly-in-method-definitions-and-calls – LittleQ

1

Первая переменная в любом методе класса является ссылка на экземпляр класса. Ваш метод ожидает две переменные: val1 и val2, но когда вы звоните self.near(val1, val2), это эквивалент вызова функции с self, val1 и val2 в качестве аргументов.

С Python Docs on Classes, второй абзац:

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

1

Как уже упоминалось ранее, но мой ответ был бы «ваш метод рядом должен быть статическим». Вместо того, чтобы передавать self, я бы сделал метод статическим, используя декоратор @staticmethod. Это объясняется тем, что передача «я» не имеет никаких преимуществ. Более того, если вы передаете себя в качестве аргумента, контролер качества, такой как комбинация Sonar Python Lint, будет обозначать его как «он должен быть статичным». Это то, о чем я часто забываю об этом (Module function vs staticmethod vs classmethod vs no decorators: Which idiom is more pythonic?).

Кроме того, я бы рекомендовал передавать маржу как переменную, а не превращать ее в глобальную переменную, которая, по моему мнению, в данный момент.