Как можно использовать комментарии типа в Python, чтобы изменить или сузить тип уже объявленной переменной таким образом, чтобы заставить pycharm
или другие системы с поддержкой типов понять новый тип.
Например, у меня может быть два класса:
class A:
is_b = False
...
class B(A):
is_b = True
def flummox(self):
return '?'
и другая функция в другом месте:
def do_something_to_A(a_in: A):
...
if a_in.is_b:
assert isinstance(a_in, B) # THIS IS THE LINE...
a_in.flummox()
Пока у меня есть оператор assert
, PyCharm будет понимать, что я сузился a_in
до класса B и не жаловался на .flummox()
. Без этого появятся ошибки / предупреждения, такие как a_in has no method flummox
.
У меня вопрос: есть ли способ PEP 484 (или преемник) показать, что a_in
(который мог изначально иметь тип A или B или что-то еще) теперь типа B * 1017? * без утверждения assert . Оператор b_in : B = a_in
также дает ошибки типа.
В TypeScript я мог бы сделать что-то вроде этого:
if a_in.is_b:
const b_in = <B><any> a_in;
b_in.flummox()
// or
if a_in.is_b:
(a_in as B).flummox()
Есть две основные причины, по которым я не хочу использовать строку assert, это (1) скорость очень важна для этой части кода, и наличие дополнительного вызова is_instance
для каждого запуска строки слишком сильно замедляет его, и (2) стиль кода проекта, который запрещает использование открытых утверждений.