用于绑定方法的MyPy类型注释?

时间:2019-09-24 17:41:59

标签: python-3.x mypy

我正在使用import pandas as pd # Creating the Index idx = pd.Index(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']) # to delete idx.delete([ column number]) 为库编写一些测试。我想为该库公开的每个函数尝试一些测试用例,因此我发现将类中每个方法的测试分组很方便。我要测试的所有功能都具有相同的签名并返回相似的结果,因此我想使用在超类中定义的辅助方法对结果进行一些断言。简化的版本将像这样运行:

pytest

class MyTestCase: function_under_test: Optional[Callable[[str], Any]] = None def assert_something(self, input_str: str, expected_result: Any) -> None: if self.function_under_test is None: raise AssertionError( "To use this helper method, you must set the function_under_test" "class variable within your test class to the function to be called.") result = self.function_under_test.__func__(input_str) assert result == expected_result # various other assertions on result... class FunctionATest(MyTestCase): function_under_test = mymodule.myfunction def test_whatever(self): self.assert_something("foo bar baz") 中,有必要在函数上调用assert_something,因为将函数分配给类属性使其成为该类的绑定方法,否则__func__()将通过作为外部库函数的第一个参数,没有任何意义。

此代码按预期工作。但是,它会产生MyPy错误:

self

根据我的注释,这是不安全的操作,这是正确的:任意Callable可能没有"Callable[[str], Any]" has no attribute "__func__" 属性。但是,我找不到任何表明__func__变量引用方法的类型注释,因此将始终具有function_under_test。我是在忽略一个,还是有另一种方法来调整我的注释或访问权限,以使其能够进行类型检查?

当然,还有许多其他方法可以解决此问题,其中一些方法甚至可能更干净(使用__func__类型,跳过类型检查,使用私有方法来返回被测函数,而不是返回将其设为类变量,将helper方法设为函数等)。我对是否有注释或其他mypy技巧可以使此代码正常工作更加感兴趣。

0 个答案:

没有答案