一种方法是使用import x,而不使用“from”关键字。这样你就可以在任何地方引用它们的名称空间。
还有其他方法吗?例如,在C ++中做ifnotdef __b__ def __b__类型的事情吗?
一种方法是使用import x,而不使用“from”关键字。这样你就可以在任何地方引用它们的名称空间。
还有其他方法吗?例如,在C ++中做ifnotdef __b__ def __b__类型的事情吗?
将任何相互依赖的模块合并为一个模块。然后引入额外的模块以恢复旧名称。
例如,
# a.py
from b import B
class A: whatever
# b.py
from a import A
class B: whatever
变成
# common.py
class A: whatever
class B: whatever
# a.py
from common import A
# b.py
from common import B
common.py
而不是a.py
和b.py
中。在我看来,这不是一个好的解决方案。 - NickA.x
使用B.y
,而B.y
使用A.z
,则可以考虑将A.z
移动到其自己的模块中。import A
并使用A.x
而不是from A import x
)。from A import *
,答案非常简单:不要这样做。通常应该使用import A
并引用限定名称。import *
是有意义的。例如,如果你想隐藏一个复杂的模块结构,或者你动态生成的模块结构或版本之间经常发生变化,或者你正在封装某个嵌套太深的其他人的包,import *
可能从“包装器模块”或顶级包模块的角度讲是合理的。但在这种情况下,你导入的任何内容都不会导入你自己。import *
且循环依赖甚至是可能存在的。from A import foo
,有办法解决这个问题(例如,import A
然后foo = A.foo
)。但你可能不想这样做。再次考虑一下是否真的需要将foo
带入你的命名空间——限定名称是一种特性,而不是需要解决的问题。from A import foo
,因为A
实际上是long_package_name.really_long_module_name
,并且由于所有这些调用long_package_name.really_long_module_name.long_class_name.class_method_that_puts_me_over_80_characters
而导致你的代码难以阅读,请记住,你总是可以使用import long_package_name.really_long_module_name as P
,然后对你的限定调用使用P
。from
中,你可能希望确保指定一个__all__
,以确保导入的名称不会出现在你的命名空间中,如果有人从交互式会话中对你进行import *
。)foo = A.foo
更好。
from foo import bar
还是from foo import *
?如果是后者,那么答案是不要这样做。除了一些特殊情况(在快速脚本或交互式会话之外,循环导入不会出现),你才需要这样做,而且我无法想到任何情况下from foo import *
和相互依赖都是有意义的。 - abarnertf
而不是x.f
,那么为什么呢?是因为x
实际上是一个40个字符长的嵌套模块名称,还是因为你想让Python感觉更像是另一种语言,或者出于某些真正的原因(例如,你想尝试from json import loads
并在失败时定义一个本地的loads
)? - abarnert