Python是否有类似C++的using关键字?

10

在C++中,你可以通过谨慎使用"using"关键字来极大地提高代码的可读性,例如:

void foo()
{
    std::vector< std::map <int, std::string> > crazyVector;
    std::cout << crazyVector[0].begin()->first;
}

变成

void foo()
{
    using namespace std; // limited in scope to foo
    vector< map <int, string> > crazyVector;
    cout << crazyVector[0].begin()->first;
}

Python中是否存在类似的东西,还是我必须完全限定每个内容?

我想添加一个免责声明,我知道使用“*”有其缺点,在范围上应适当加以限制。

6个回答

19

正如Bill所说,Python确实有这样的结构

from X import *

但你也可以明确指定从模块(命名空间)中导入哪些名称:

from X import foo, bar, blah
这样做可以使代码更易于阅读和理解,因为查看源代码时,不需要搜索所有导入的模块以查找标识符的来源。以下是一个相关问题:在没有歧义的情况下的命名空间规范 编辑:针对Pax的评论,我想提一下您也可以编写这样的内容。
import X.foo

但是你需要编写以下代码:

X.foo.moo()

不是只

foo.moo()

当然,这并不一定是件坏事。在我的代码中,我通常会同时使用from X import yimport X.y的混合形式,以使代码更加清晰易懂。这在某种程度上确实是主观的。


你可能想要扩展这个,包括 "import X",这样就可以使用该模块中的 X.y 东西。有时我更喜欢这种方式来减少命名空间的污染。 - paxdiablo
1
为什么说“不像C++”?不能使用“using std::string;”吗? - Constantin
哦,是的,我忘了那个... 我并不是主要的C++程序员。然而Python的import还是更强大一些,因为你可以导入单独的函数和变量,而在C++中我认为这是不可能的。 - David Z
1
David,在C++中也可以实现(使用“using declaration”)。好的。你能否解释一下是否可以在函数内部使用Python的“import”? - Johannes Schaub - litb
通常情况下,在Python中,“import”是一个语句,可以在任何地方使用,比如函数调用。但是通配符导入只能在模块级别使用。 - David Z

7
当然,Python的动态性使这变得轻而易举。如果你有一个深埋在命名空间中的类:foo.bar.baz.blah,你可以这样做:
def foo:
    f = foo.bar.baz.blah
    f1 = f()

1
对我来说,这是正确的答案,因为它最类似于C++的情况。虽然通常在Python中会使用修改后的导入语句,但有时我会看到需要像这样别名类型,以免在代码的特定部分中不得不输入那么长、复杂的类型。 - Tom

6
import X

或者

from X import *

或者
from X import a, b, c

其中 X 是您想要使用的 Python 模块。

如果您能提供一个您认为需要整理的 Python 代码示例,那将会很有帮助。


1
Python 中另一个导入模块的选项是使用 "as" 关键字。例如:
from foo import bar as baz

这将把foo.bar作为baz引入到当前模块中,使实体在当前模块中获得不同的名称,可能是为了避免与当前模块中具有相同名称的现有实体重叠。

1

除了David的回答之外:

  1. 为了符合PEP8,应该在from X import (foo, bar, blah)中使用圆括号。
  2. 完整的语法允许将包名重命名(重新绑定)为当前模块范围内的新标识符,如from foo import bar as baz

我建议查阅import关键字、内置的__import__sys.modules的解释作为进一步阅读。


0
请注意:
from foo import bar

即使barfoo包中的一个模块,这个方法仍然有效。这样可以限制命名空间污染,而不必为您可能想要使用的foo.bar中的每个函数/类命名。它还有助于代码读者,因为他们将看到对bar.baz()的调用,并更好地了解baz来自哪里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接