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

我将添加免责声明,我知道使用有其陷阱,并且应该适当限制其范围。

有帮助吗?

解决方案

如比尔说,Python做具有结构

from X import *

但你也可以明确地指定名称要从模块(命名空间)输入:

from X import foo, bar, blah

这往往使更加可读代码/更容易理解,因为有人看到在源的标识符不需要通过所有导入的模块打猎看到来自何处。这里有一个相关的问题:命名空间规范在Ambuguity 的缺失

修改的:响应于大同的评论,我会提到,你也可以写东西像

import X.foo

但随后你需要写

X.foo.moo()

,而不是仅仅

foo.moo()

这未必是坏事,当然。我通常使用的from X import yimport X.y形式,无论我觉得让我的代码清晰的混合物。这当然是一个主观的东西在一定程度上。

其他提示

import X

from X import *

from X import a, b, c

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

这将有助于您给我们一个Python代码示例,你认为需要清理。

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

def foo:
    f = foo.bar.baz.blah
    f1 = f()

除了大卫的回答之外:

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

我建议查看手册 导入关键字, , 这 __import__ 内置和解释 系统模块 作为进一步阅读。

在Python另一个选项是构建体“为”导入时。例如:

from foo import bar as baz

这将在作为当前模块,其允许所述实体到所述当前模块中获取一个不同的名称,可能是为了避免隐藏现有实体当前模块中具有相同名称在foo.bar带来baz

请注意

from foo import bar

有效,即使bar处于foo包的模块。这使您可以限制你的命名空间污染,而不必名foo.bar每个函数/类,你可能会在乎使用。它还有助于你的代码的读者,因为他们会看到一个电话bar.baz(),并有一个更好的主意,其中baz是从哪里来的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top