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是否存在类似的东西,还是我必须完全限定所有内容?

我将添加我知道 using 有其缺陷的免责声明,并且应适当限制其范围。

4

6 回答 6

19

正如比尔所说,Python 确实有结构

from X import *

但您也可以明确指定要从模块(命名空间)导入的名称:

from X import foo, bar, blah

这往往使代码更具可读性/更易于理解,因为在源代码中看到标识符的人不需要搜索所有导入的模块来查看它的来源。这是一个相关的问题:Namespace Specification In Absence of Ambuguity

编辑:作为对 Pax 评论的回应,我会提到你也可以写类似的东西

import X.foo

但是你需要写

X.foo.moo()

而不仅仅是

foo.moo()

当然,这不一定是坏事。我通常混合使用from X import yimport X.y形式,只要我觉得让我的代码最清晰。在某种程度上,这当然是一件主观的事情。

于 2009-02-15T01:58:04.147 回答
7

当然,python 的活力使这变得微不足道。如果你有一个深埋在命名空间中的类:foo.bar.baz.blah,你可以这样做:

def foo:
    f = foo.bar.baz.blah
    f1 = f()
于 2009-02-15T01:56:14.977 回答
6
import X

或者

from X import *

或者

from X import a, b, c

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

给我们一个您认为需要清理的 Python 代码示例对您很有帮助。

于 2009-02-15T01:54:18.320 回答
1

除了大卫的回答:

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

我建议查阅import 关键字的手册、sys.modules__import__内置和解释作为进一步阅读。

于 2012-01-06T07:35:28.173 回答
1

Python 中的另一个选项是导入时的构造“as”。例如:

from foo import bar as baz

这将foo.barbaz在当前模块中一样引入,允许实体在当前模块中获得不同的名称,可能是为了避免在当前模块中隐藏具有相同名称的现有实体。

于 2018-11-15T13:51:15.553 回答
0

注意

from foo import bar

即使barfoo包中的一个模块也可以工作。这使您可以限制命名空间污染,而不必命名foo.bar您可能希望使用的每个函数/类。它还可以帮助读者阅读您的代码,因为他们会看到调用bar.baz()并更好地了解baz来自哪里。

于 2009-02-15T05:23:17.197 回答