有没有办法绕过Python中的命名空间/模块名称?

1 投票
1 回答
3344 浏览
提问于 2025-04-17 19:24

如果你有一个像 module 这样的模块,你能不能不使用这个模块,直接用里面的函数呢?

我已经导入了这个模块,但编译器还是说找不到 function。我还是得用 module.function() 来调用。

这个模块里还有很多其他函数,所以我不想一个一个重新定义,只想尽量避免每次都输入 module

1 个回答

6

在Python中,导入其实就是把一些东西加到你的命名空间里。你如何使用导入的名字,就是 import foofrom foo import bar 之间的区别。

在第一个例子中,你只导入了模块的名字 foo,所以要使用里面的东西,就得用 foo.bar() 这样的方式。第二个例子中,你明确只导入了 bar,所以你可以直接用 bar() 来调用它。

from foo import * 会把所有可以导入的名字(那些在一个特殊变量 __all__ 中定义的)都导入到当前的命名空间里。虽然这样可以用,但不推荐,因为你可能会不小心覆盖掉已经存在的名字。

foo = 42
from bar import * # bar contains a `foo`
print foo # whatever is from `bar`

最佳做法是只导入你需要的东西:

from foo import a,b,c,d,e,f,g

或者你可以给名字起个别名:

import foo as imported_foo

总之,尽量避免使用 from foo import *

撰写回答