2015-07-21 61 views
2

我有一個包含類似下面的單元測試的一些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個參數嗎?

+3

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

回答

5
+0

噢 - 這可能是一個愚蠢的問題,但爲什麼我必須在自己的函數中傳入'self',如果我沒有引用它呢? –

+3

@AbeMiessler [參考](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

在任何類方法中的第一變量是對類實例的引用。您的方法預計有兩個變量:val1val2,但是當您調用self.near(val1, val2)時,它等效於調用self,val1val2作爲參數的函數。

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

它之前已經提及,但我的回答是「你的方法附近應該是靜態的。」 而不是傳遞自己,我會使用@staticmethod裝飾器使方法靜態。這是因爲通過自我沒有好處。更重要的是,如果您將自己作爲參數傳遞,像Sonar Python Lint組合這樣的質量檢查器會將其標記爲「它應該是靜態的」。這是我經常忘記的事情(Module function vs staticmethod vs classmethod vs no decorators: Which idiom is more pythonic?)。

此外,我會建議將margin作爲變量來使用,而不是將它作爲我想象的全局變量。

相關問題