2

我已经将一个大类实现拆分为不同的包 [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:无法为“方法”导入 pyi [pyi-error]

找不到“模型”的 pyi,引用自“方法”

我怎样才能避免这种情况并仍然进行类型检查?

[1] 实际上,我只用了一种很小的实用方法就完成了这项工作。无需大喊将一个类拆分到多个包中。

4

1 回答 1

2

此解决方案使用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不起作用,这可能是一个错误?

于 2020-04-09T14:57:03.210 回答