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

时间:2009-02-15 01:50:35

标签: python namespaces using

在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 个答案:

答案 0 :(得分: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形式的混合,无论我觉得什么使我的代码最清晰。这在某种程度上肯定是一个主观的东西。

答案 1 :(得分:6)

import X

from X import *

from X import a, b, c

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

您可以向我们提供您认为需要清理的Python代码示例。

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

除了大卫的回答:

  1. 为了PEP8,应该在from X import (foo, bar, blah)中使用圆括号。
  2. 完整语法允许将包名称重命名(重新绑定)到当前模块范围内的新标识符,如from foo import bar as baz中所示。
  3. 我建议您查看import keyword手册,__import__内置及 sys.modules 的说明,以便进一步阅读。

答案 4 :(得分:1)

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

from foo import bar as baz

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

答案 5 :(得分:0)

请注意

from foo import bar
即使barfoo包中的模块,

仍然有效。这使您可以限制名称空间污染,而无需在foo.bar中命名您可能需要使用的每个函数/类。它还可以帮助读者了解您的代码,因为他们会看到bar.baz()的来电并更好地了解baz的来源。