Singledispatch и введите в качестве входного аргумента - PullRequest
6 голосов
/ 28 марта 2019

Я хочу иметь возможность сделать это:

from typing import Type
from functools import singledispatch

class A:
    pass

class B(A):
    pass

@singledispatch
def foo(arg):
    print('default')

@foo.register
def _(arg: Type[A]):
    print(arg)

foo(A)
foo(B)

Однако я получаю Invalid annotation for 'arg'. typing.Type[__main__.arg] is not a class.

Полагаю, singledispatch пока что не полностью поддерживает typing. Есть какой-нибудь элегантный обходной путь?

UPD Я не могу изменить A и B.

1 Ответ

2 голосов
/ 28 марта 2019

Вы можете присвоить A метакласс, и тогда все подклассы A будут экземплярами этого метакласса:

from functools import singledispatch

class AMeta(type): pass

class A(metaclass=AMeta): pass

class B(A): pass

@singledispatch
def foo(arg):
    print('default')

@foo.register
def _(arg: AMeta):
    print('A or B')

foo(A) # A or B
foo(B) # A or B
foo(A()) # default

class C: pass

foo(C) # default
...