Я пытаюсь понять, почему pycharm предупреждает меня о неправильном типе при использовании реализации абстрактного класса со статическим методом в качестве параметра.
Чтобы продемонстрировать, я приведу простой пример. Допустим, у меня есть абстрактный класс с одним методом, класс, который реализует (наследует) этот интерфейсный класс, и метод, который получает реализацию, которую он должен использовать в качестве параметра.
import abc
class GreetingMakerBase(abc.ABC):
@abc.abstractmethod
def make_greeting(self, name: str) -> str:
""" Makes greeting string with name of person """
class HelloGreetingMaker(GreetingMakerBase):
def make_greeting(self, name: str) -> str:
return "Hello {}!".format(name)
def print_greeting(maker: GreetingMakerBase, name):
print(maker.make_greeting(name))
hello_maker = HelloGreetingMaker()
print_greeting(hello_maker, "John")
Обратите внимание, что вподсказка типа print_greeting
Я использовал GreetingMakerBase
, и потому что isinstance(hello_maker, GreetingMakerBase) is True
Pycharm не жалуется на это.
Проблема в том, что у меня много реализаций моего класса, и я не хочу делать экземпляркаждый, поэтому я сделаю этот метод make_greeting
статическим, например:
class GreetingMakerBase(abc.ABC):
@staticmethod
@abc.abstractmethod
def make_greeting(name: str) -> str:
""" Makes greeting string with name of person """
class HelloGreetingMaker(GreetingMakerBase):
@staticmethod
def make_greeting(name: str) -> str:
return "Hello {}!".format(name)
def print_greeting(maker: GreetingMakerBase, name):
print(maker.make_greeting(name))
print_greeting(HelloGreetingMaker, "John")
Это все еще работает так же, но, очевидно, потому что параметр в вызове функции теперь является именем класса вместо экземпляраоб этом Пичарм жалуется на то, что: Expected type 'GreetingMakerBase', got 'Type[HelloGreetingMaker]' instead.
Есть ли способ, которым я могу решить это предупреждение, не создавая экземпляр класса HelloGreetingMaker
?