Python подсказок типов с импортированными методами класса - PullRequest
0 голосов
/ 03 августа 2020

Чтобы разделить большой класс на несколько файлов, этот ответ рекомендует использовать команду import на уровне class для загрузки методов, определения которых могут быть перемещены в другие модули. В качестве минимального примера:

class_def.py:

class C:
    from _methods import m

_methods.py:

def m(self):
    return "hello"

Обычно большинство IDE, в которых выполняется завершение кода функции, распознают функции, которые являются определены в некотором классе как связанные методы, и self будет автоматически распознаваться как имеющий тип класса, в котором был определен метод. К сожалению, в приведенной выше ситуации я не определил m внутри класса. Глядя только на _methods.py, невозможно сказать, что self должен иметь тип C.

В определении m, если я вставлю строку, начинающуюся с self., мой IDE не может предложить m или любые другие методы, которые я мог бы реализовать в C.

Очевидным решением было бы добавить подсказку типа:

from class_def import C

def m(self: C):
    return "hello"

Но теперь у нас есть циклический импорт: определение C импорт _methods, но _methods импорт C. Как я могу создать подсказку типа, не вводя циклический импорт?

В настоящее время я использую Python 3.7, но меня также интересуют решения, требующие более поздних версий.

1 Ответ

0 голосов
/ 03 августа 2020
  1. Исправьте циклический импорт, используя флаг typing.TYPE_CHECKING для импорта C только во время проверки типа.

  2. Это оставляет значение C undefined во время выполнения. Либо заключите его в кавычки ("C"), либо импортируйте __future__.annotations:

_methods.py вариант 1:

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from class_def import C

def m(self: "C"):
    return "hello"

_methods.py вариант 2:

from __future__ import annotations
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from class_def import C

def m(self: C):
    return "hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...