Прервать цикл импорта при проверке типа - PullRequest
0 голосов
/ 09 апреля 2020

Я разделил реализацию большого класса на разные пакеты [1] и использовал импорт внутри тела метода, чтобы избежать цикла компиляции, как показано ниже:

# model.py

class MyInt:
  def __init__(self, value: int):
    self.value = value

  def is_prime(self) -> bool:
    from methods import is_prime
    return is_prime(self)
# methods.py

from model import MyInt

def is_prime(x: MyInt) -> bool:
  # TODO: actually implement this
  return x.value == 2 or x.value % 2 == 1

Однако pytype это не устраивает, так как не удается найти файл pyi при достижении цикла импорта:

Файл "/home/bkim/Projects/mwe/model.py", строка 6, в is_prime: Couldn 'импортировать pyi для' методов '[pyi-error]

Не удается найти pyi для "модели", на которую ссылаются "методы"

Как можно избежать этого и до сих пор получить проверку типов?

[1] Я сделал это всего лишь одним крошечным утилитарным методом. Не нужно кричать о разделении класса на несколько пакетов.

1 Ответ

0 голосов
/ 09 апреля 2020

В этом решении используется typing.TYPE_CHECKING, чтобы иметь одно поведение во время проверки типа, а другое во время выполнения:

import typing

class MyInt:
  def is_prime(self) -> bool:
    if typing.TYPE_CHECKING:
      return False  
    from methods import is_prime
    return is_prime(self)

Любопытно, что использование from typing import TYPE_CHECKING не работает, что может быть ошибкой?

...