我經常發現自己試圖稍微濫用python允許的一些dinamicity(我在這裏使用python3,但不應該有很多差異)。綁定調用類內其他方法的方法
在這種情況下,我想將我的unittest.TestCase
中的單個test_方法拆分爲在運行時創建的幾個方法。
(這是一個關於羅馬數字卡塔,但我居然沒有TDD:我寫的測試版本)
這是測試:
這就是我試着寫它:
from functools import partial
from types import MethodType
class TestNumbers(TestCase):
pass
def test_number(self, n):
self.assertEqual(n, roman_to_int(int_to_roman(n)))
for i in range(3000):
name = str(i)
test_method = MethodType(partial(test_number, n=i), TestNumbers)
setattr(TestNumbers, "test" + name, test_method)
(或者,我也試圖dinamically創造了大量的TestCase的子類和setattr(globals(), ...)
他們)
我知道:這並沒有太多的目的,也可能比較慢,等等。但這只是一個POC,我試圖瞭解如何讓它工作
通過使用MethodType,測試變成了一個綁定方法,但在裏面,assertEqual顯然成爲一個函數,並且當試圖調用它時它會失敗,TypeError: assertEqual() takes at least 3 arguments (2 given)
我試圖test_number改變
def test_number(self, n):
self.assertEqual(self, n, roman_to_int(int_to_roman(n)))
但這隻會挖掘同樣的問題,更深的隱藏的TestCase方法:TypeError: _getAssertEqualityFunc() takes exactly 3 arguments (2 given)
我看着這裏stacko verflow和發現類似的問題(如Python: Bind an Unbound Method?),但沒有一個處理綁定內部的方法,它調用目標類的其他綁定方法
我也試圖查看元類(http://docs.python.org/py3k/reference/datamodel.html#customizing-class-creation),但它不似乎與我正在嘗試做的事情相匹配
assertEqual **不會**成爲一個函數顯然:http://paste.pocoo.org/show/584485/ 和python3 MethodType只有2個參數:http ://paste.pocoo.org/show/584486/ – berdario 2012-04-20 08:30:20
在Python 3上,沒有未綁定和綁定的方法,只是方法。我改變了相應的答案。 – 2012-04-20 14:21:18
_partial對象不會變成方法_我完全沒有想到!感謝:D – berdario 2012-04-20 14:45:44