2016-01-19 23 views
0

我在做Python Koans(在Python 2上),在about_classes部分有點迷路。'with'+'assertRaises'做什麼?

這是代碼,我不知道該怎麼辦/發生的事情:

class Dog5(object): 
    def __init__(self, initial_name): 
     self._name = initial_name 

    @property 
    def name(self): 
     return self._name 

def test_args_must_match_init(self): 
    self.assertRaises(___, self.Dog5) # Evaluates self.Dog5() 

我明白爲什麼我在這裏得到一個錯誤,因爲類需要一個自變量(和零給出),但不要這裏沒有得到什麼預期的迴應。

所以找誰了一個解決方案,我發現這個代碼:

def test_args_must_match_init(self): 
    with self.assertRaises(TypeError): 
      self.Dog5() 

但我不明白這一點。

現在問題來了: 最後一段代碼是幹什麼的?

with assertRaises(TypeError): Dog5()在做什麼?

回答

1

docs

assertRaises(例外,可贖回,* ARGS,** kwds)

assertRaises(例外)

測試,一個使用任何位置或關鍵字參數調用callable時引發異常e也傳遞給assertRaises()。如果發生異常,則測試通過;如果發生另一個異常,則爲錯誤;如果未發生異常,則發生錯誤。要捕獲任何一組異常,包含異常類的元組可以作爲例外傳遞。

所以,with assertRaises(TypeError): Dog5()斷言self.Dog5()提出了一個TypeError

的Python 2.7引入了使用assertRaises爲上下文管理器(因此與with)的可能性,而在以前的Python版本,你會被稱爲self.assertRaises(TypeError, self.Dog5)

+0

謝謝。這個上下文管理器是我沒有得到的部分。我想我現在明白了一點。 – tglaria

3

它聲稱調用Dog5()沒有參數將提高TypeError,這將成功,因爲沒有AssertionError。在assertRaises()

文檔是相當直接:

assertRaises(exception, msg=None)

測試該調用時被調用與同樣傳遞給assertRaises()任何位置或關鍵字參數的異常。 如果發生異常,則通過測試,如果發生另一個異常則爲錯誤,如果未發生異常則失敗。要捕獲任何一組異常,包含異常類的元組可能會作爲例外傳遞。

(重點煤礦)

當傳遞的exception作爲TypeError和可選msg一個Context Manager被創建,而不是作爲進一步記錄的函數:

如果只有異常和可能的MSG參數,返回一個上下文管理器,以便被測代碼可以內聯寫入,而不是作爲函數。

它比它看起來更簡單。