Ввод Callable в Python для конкретных методов - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь быть очень строгим с набором текста и сталкиваюсь с проблемой, когда хочу набрать 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 ()

Код, показанный ниже, не работает :(компилятор жалуется, когда я передаю функцию div в test_add_sub! Также я не могу написать 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'

Большое спасибо всем заранее.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Обнаружение времени выполнения

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)

Подробнее о Методы экземпляра здесь .

0 голосов
/ 08 сентября 2018

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...