Pad*_*Key 5 python python-import python-3.x
假设我使用具有以下结构的python包:
package/
bar.py
foo.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
bar.py包含类bar并foo.py包含函数foo。当我想导入函数/类时,我必须写
from package.bar import bar
from package.foo import foo
Run Code Online (Sandbox Code Playgroud)
或者我可以写
from package import bar
from package import foo
Run Code Online (Sandbox Code Playgroud)
更普遍的问:导入与类/函数同名的模块时,是否可以总是忽略类/函数名?
不,您不能省略模块或对象名称。没有任何机制可以隐式执行此类导入。
来自Python 之禅:
显式的比隐式的好。
请注意,导入模块本身也应该始终是一个有效的选项。如果from package import bar改为导入package.bar.bar对象,那么您就必须不遗余力地访问package.bar模块本身。
此外,这种隐式行为(自动导入模块中包含的对象而不是模块本身)会导致令人困惑的不一致。
import package.bar添加到您的命名空间?引用package.bar是模块还是包含的对象?from package import bar然后给你模块吗?有些操作仍然会成功,导致奇怪的、难以调试的错误,而不是明显的ImportError异常。一般来说,Python 模块很少只包含一件事。Python 不是 Java,模块由密切相关的一组对象组成,而不仅仅是一个类或函数。
现在,包中存在固有的名称空间冲突;from package import foo可以引用package模块上设置的名称,也可以引用嵌套的模块名称。在这种情况下,Python 将首先查看package名称空间。
这意味着您可以明确决定在包级别提供foo和对象,如下所示:barpackage/__init__.py
# in package/__init__.py
from .foo import foo
from .bar import bar
Run Code Online (Sandbox Code Playgroud)
现在from package import foo,from package import bar将为您提供这些对象,掩盖嵌套模块。
将对象从子模块导入到包命名空间中的一般机制是编写公共 API 的常用方法,同时仍然使用内部模块对代码进行逻辑分组。例如,Python标准库中的json.JSONDecodeError异常json.exceptions是在模块中定义的,然后导入到json/__init__.py. 然而,我通常不鼓励屏蔽子模块;但是foo并bar进入一个具有不同名称的模块。
| 归档时间: |
|
| 查看次数: |
1396 次 |
| 最近记录: |