在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是否存在类似的东西,或者我是否必须完全限定所有内容?
我将添加免责声明,我知道使用有其缺陷,应该适当限制范围。
答案 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 y
和import 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)
除了大卫的回答:
from X import (foo, bar, blah)
中使用圆括号。 from foo import bar as baz
中所示。我建议您查看import keyword手册,__import__
内置及 sys.modules 的说明,以便进一步阅读。
答案 4 :(得分:1)
Python中的另一个选项是导入时的结构“ as”。例如:
from foo import bar as baz
这将在当前模块中将foo.bar
引入baz
中,这允许实体在当前模块中获得不同的名称,可能避免在当前模块中隐藏具有相同名称的现有实体名称。
答案 5 :(得分:0)
请注意
from foo import bar
即使bar
是foo
包中的模块,仍然有效。这使您可以限制名称空间污染,而无需在foo.bar
中命名您可能需要使用的每个函数/类。它还可以帮助读者了解您的代码,因为他们会看到bar.baz()
的来电并更好地了解baz
的来源。