在Python中输入Callable到特定方法

问题描述 投票:0回答:2

我试图对我的输入非常严格,当我只想为一些非常具体的方法输入 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 时,linter 和编译器都会抱怨!我也不能编写 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'

提前非常感谢大家。

python python-typing mypy
2个回答
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
投票

运行时检测

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)

了解更多关于 实例方法 这里

© www.soinside.com 2019 - 2024. All rights reserved.