我试图对输入进行严格的规定,而我只想用几种非常具体的方法键入Callable时遇到一个问题!
我有一堂课
class Complex:
def __add__(self, other):
return Complex()
def __sub__(self, other):
return Complex()
def __div__(self, other):
return Complex()
在另一个文件中,我想编写一个接受Callable的方法,但是该方法的参数只能是 add 函数或 sub 函数。这意味着如果我尝试将 div 作为函数传递给test_add_sub()
,我希望linter抛出错误。下面的代码似乎不起作用:(当我将 div 函数传递给test_add_sub时,lint或编译器都会抱怨!我也无法编写Complex.complex_func()。
add_sub_type = Complex.__add__ or Complex.__sub__
add_sub_type2 = Callable[[Complex.__add__ or Complex.__sub__], None]
def test_add_sub(complex_func: add_sub_type) -> None:
print(complex_func)
Complex.complex_func() <-- 'Class Complex has no complex_func member'
非常感谢大家。
答案 0 :(得分:2)
typing
无法做到这一点。静态伪类型系统不允许您定义具有任意成员集的类型。 (此外,Complex.complex_func()
也不是您如何称呼complex_func
的方式。)
如果您确实希望对此进行基于类型的静态检查,则可以使用枚举代替方法:
class ComplexAddSub(enum.Enum):
add = Complex.__add__
sub = Complex.__sub__
def __call__(self, left: Complex, right: Complex):
return self.value(left, right)
def whatever(func: ComplexAddSub):
func(Complex(), Complex())
whatever(ComplexAddSub.add)
答案 1 :(得分:1)
def test_add_sub(complex_func):
tester = {Complex.__addr__: False, Complex.__sub__: False}
if (tester.get(complex_func, True)):
raise RuntimeError('Invalid argument!')
#complex_func(some_complex_object, another_complex_object)
详细了解实例方法 here。