导入类只是为了在python中键入?

导入类只是为了在python中键入?,python,python-import,python-typing,Python,Python Import,Python Typing,我正在尝试使用Python3.8中的键入,我有点卡住了。 示例:我主要在main.py中开发。我还有一个类util.py,它包含一些帮助函数和类。但是这些类还需要从main.py导入类以进行键入。现在,当我想在main.py中使用util.py中的函数时,我还需要导入它-但是由于循环导入,我会得到一个错误(这是正确的) 有办法解决这个问题吗 提前谢谢 循环导入在Python中不是即时错误;如果你以特定的方式使用它们,它们只是一个错误。我相信你在找我 示例main.py: import util

我正在尝试使用Python3.8中的键入,我有点卡住了。 示例:我主要在
main.py
中开发。我还有一个类
util.py
,它包含一些帮助函数和类。但是这些类还需要从
main.py
导入类以进行键入。现在,当我想在
main.py
中使用
util.py
中的函数时,我还需要导入它-但是由于循环导入,我会得到一个错误(这是正确的)

有办法解决这个问题吗


提前谢谢

循环导入在Python中不是即时错误;如果你以特定的方式使用它们,它们只是一个错误。我相信你在找我

示例
main.py

import util

class SomeClass:
    pass
示例
util.py

import main

# We can't use main.SomeClass in the type signature because of the cycle,
# but we can forward reference it, which the type system understands.
def make_some_class() -> "main.SomeClass":
    return main.SomeClass()

我认为防止这种情况的最好方法是将每个类移动到它们自己的文件中,并在需要的地方导入它们。 在单个文件中声明多个类不利于代码维护,并且会使大型应用程序更难调试


如果每个类都相互依赖,我认为你不能避免循环导入你描述它的方式,Sylvio的答案是正确的,但我想在你的标题中键入

导入类只是为了在python中键入

如果导入类的唯一原因是为了解决某些键入问题,则可以使用常量使该导入具有条件

引用该文件:

运行时还是类型检查

有时,有些代码必须由类型检查器(或其他静态分析工具)查看,但不应执行。对于这种情况,类型模块定义了一个常量,TYPE_CHECKING,该常量在类型检查(或其他静态分析)期间被视为True,但在运行时被视为False。例如:

(请注意,类型注释必须用引号括起来,使其成为“正向引用”,以便在解释器运行时隐藏昂贵的_mod引用。在#类型注释中,不需要引号。)


底线是,除了在进行类型检查时,您可能不必全部导入它。

我不同意。“每个文件一个类”是一种非常Java风格的思维方式,对于这种语言来说是惯用的,但在Python中,类和模块是不同的概念,没有理由自动将它们耦合起来。Silvio没有投反对票,这是可以理解的,因为他有一个“竞争性”的答案,但这不是一条路。作为一个新来者,请原谅投反对票,但同样重要的是,不要用一个不适用于Python的如此广泛的概括将其他人引向错误的方向。欢迎登机。
import typing

if typing.TYPE_CHECKING:
    import expensive_mod

def a_func(arg: 'expensive_mod.SomeClass') -> None:
    a_var = arg  # type: expensive_mod.SomeClass
    ...