导入类只是为了在Python中输入?

问题描述 投票:0回答:3

我正在尝试使用 Python 3.8 中的输入,但有点卡住了。 示例:我主要在

main.py
进行开发。我还有一个类
util.py
,其中包含一些辅助函数和类。但这些类还需要从
main.py
导入类来进行打字。现在,当我想在
util.py
中使用
main.py
中的函数时,我还需要导入它 - 但随后我会因为循环导入而收到错误(这是正确的)。

有办法解决这个问题吗?

python python-typing
3个回答
9
投票

西尔维奥的答案是正确的,但我想解决只是为了在你的标题中输入

导入类只是为了在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引用。在 # 类型注释中不需要引号。)

底线是您很可能不必全部导入,除非您进行类型检查


5
投票

循环导入在 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()

-1
投票

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

如果每个类都相互依赖,我认为你无法避免以你描述的方式循环导入

© www.soinside.com 2019 - 2024. All rights reserved.