如何在python中定义命名空间?

joh*_*ith 7 python

似乎python确实有名称空间.但我能得到的是人们告诉我什么名称空间或范围.那么如何在python中定义命名空间?我只需要语法(并举例说明会更好).

kfb*_*kfb 6

Python 中的“命名空间”更多地是由磁盘上代码的布局定义的,而不是由任何特定语法定义的。给定一个目录结构:

my_code/
    module_a/
        __init__.py
        a.py
        b.py
    module_b/
        __init__.py
        a.py
        b.py
    __init__.py
    main.py
Run Code Online (Sandbox Code Playgroud)

假设每个a.pyb.py文件都包含一个函数 ,fn()则解析命名空间的导入语法的工作方式如下(来自main.py):

from module_a.a import fn  # fn() from module_a/a.py
from module_a.b import fn  # fn() from module_a/b.py
from module_b.a import fn  # fn() from module_b/a.py
from module_b.b import fn  # fn() from module_b/b.py
Run Code Online (Sandbox Code Playgroud)

此时,fn()可以在其中使用main.py并将调用您导入的任何实现。

也可以使用from module import *语法,但为了更具体,不鼓励这样做:

from module_a.a import *
Run Code Online (Sandbox Code Playgroud)

这里,fn()可以在 中使用main.py,也可以在 中定义的任何其他符号使用module_a/a.py

如果我们想要访问module_a/a.py'sfn()fn()from module_b/b.py,我们可以执行以下两种操作之一:要么使用以下from module import thing as something语法:

from module_a.a import fn as module_a_fn
from module_b.b import fn as module_b_fn
Run Code Online (Sandbox Code Playgroud)

并在我们的main.pyasmodule_a_fn()和中使用它们module_b_fn(),或者我们可以导入模块并直接在代码中引用它,所以在 中main.py

import module_a.a
import module_a.b

module_a.a.fn()  # call fn() from module_a/a.py
module_a_b.fn()  # call fn() from module_a/b.py
Run Code Online (Sandbox Code Playgroud)

我希望这有助于更多地阐明用法。

  • 这个答案没有考虑类、NamedTuples 或定义范围的其他事物,因此它们是命名空间。 (5认同)