python 有类似 C++ 的 using 关键字吗?
-
23-08-2019 - |
题
在 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 y
和import 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()
在Python另一个选项是构建体“为”导入时。例如:
from foo import bar as baz
这将在作为当前模块,其允许所述实体到所述当前模块中获取一个不同的名称,可能是为了避免隐藏现有实体当前模块中具有相同名称在foo.bar
带来baz
。
请注意
from foo import bar
有效,即使bar
处于foo
包的模块。这使您可以限制你的命名空间污染,而不必名foo.bar
每个函数/类,你可能会在乎使用。它还有助于你的代码的读者,因为他们会看到一个电话bar.baz()
,并有一个更好的主意,其中baz
是从哪里来的。
不隶属于 StackOverflow