我正在尝试使用 Python 3.8 中的输入,但有点卡住了。 示例:我主要在
main.py
进行开发。我还有一个类 util.py
,其中包含一些辅助函数和类。但这些类还需要从 main.py
导入类来进行打字。现在,当我想在 util.py
中使用 main.py
中的函数时,我还需要导入它 - 但随后我会因为循环导入而收到错误(这是正确的)。
有办法解决这个问题吗?
西尔维奥的答案是正确的,但我想解决只是为了在你的标题中输入。
导入类只是为了在Python中输入?
如果导入类的唯一原因是为了解决某些键入问题,则可以使用 typing.TYPE_CHECKING 常量使导入成为有条件的。
引用该文档:
运行时或类型检查?
有时有些代码必须由类型检查器(或其他静态分析工具)查看,但不应执行。对于这种情况,类型模块定义了一个常量 TYPE_CHECKING,在类型检查(或其他静态分析)期间被视为 True,但在运行时被视为 False。示例:
import typing
if typing.TYPE_CHECKING:
import expensive_mod
def a_func(arg: 'expensive_mod.SomeClass') -> None:
a_var = arg # type: expensive_mod.SomeClass
...
(请注意,类型注释必须用引号引起来,使其成为“前向引用”,以在解释器运行时隐藏昂贵的_mod引用。在 # 类型注释中不需要引号。)
底线是您很可能不必全部导入,除非您进行类型检查。
循环导入在 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()
我认为防止这种情况的最好方法是将每个类移动到自己的文件中,并将它们导入到需要的地方。 在单个文件中声明多个类不利于代码维护,并且会使大型应用程序更难以调试。
如果每个类都相互依赖,我认为你无法避免以你描述的方式循环导入