精华内容
下载资源
问答
  • python命名空间
    2020-01-02 15:29:01

    参考   Python命名空间包 - 云+社区 - 腾讯云

    命名空间包是对相关的包或模块进行分组的一种方法,通常是一个被忽略的功能,它对于在较大的项目中构建打包生态系统非常有用。

    如果你的应用组件的开发、打包和版本化都是独立的,但仍然希望从同一个命名空间访问它们,那么命名空间包特别有用,它有利于明确每个包所属的组织或项目。

    例如,假设有一个 Acme 公司,该公司中使用共同的 acme 命名空间,同时创建通用的 acme 命名空间包作为该组织的其他包的容器。如果 Acme 公司中的某人想要向这个命名空间贡献一个与 SQL 相关的库,那么他需要在 acme 中注册自己新的 acme.sql 包,整个文件结构如下所示:

    $tree acme/
    acme/
    ├───acme
    │      ├───__init__.py
    │      └───sql
    │              └──__init__.py
    └───setup.py
    
    2 directories, 3 files

    在此基础上,如果想添加一个新的子包,例如添加 templating,则需要将其包含在 acme 的源代码树中,如下所示:

    $tree acme/
    acme/
    ├───acme
    │      ├───__init__.py
    │      ├───sql
    │      │      └──__init__.py
    │      └───templating
    │              └──__init__.py
    └───setup.py
    
    3 directories, 4 files

    仔细观察就会发现,采用这种方式几乎不可能单独开发 acme.sql 和 acme.templating。且 setup.py 脚本还必须指定每个子包的所有依赖,所以不可能(至少非常困难)选择性地安装 acme 中的部分组件。此外,如果某些子包的需求文件有冲突,是一个无法解决的问题。

    通过利用命名空间包,我们可以单独保存每个子包的源代码树,如下所示:

    $tree acme.sql/
    acme.sql/
    ├───acme
    │      └───sql
    │              └──__init__.py
    └───setup.py
    
    2 directories, 2 files
    
    $tree acme.templating/
    acme.templating/
    ├───acme
    │      └───templating
    │                 └──__init__.py
    └───setup.py
    
    2 directories, 2 files

    由此,就可以在 PyPI 或者使用的任何包索引中单独注册它们,用户还可以从 acme 命名空间中选择想要安装的子包,而无需安装通用的 acme 包,执行代码如下:

    $pip install acme.sql acme.templating

    注意,独立的源代码树不足以在 Python 中创建命名空间包,如果不想让包之间相互覆盖,就需要做一些额外的工作,此外,正确的处理方式也会随着 Python 版本的不同而有所不同。

    隐式命名空间包

    如果你只使用 Python 3.x,也只面向 Python 3.x 的用户,则可以使用 PEP 420 引入的定义命令空间的新方法,即隐式命名空间包。它是标准路径的一部分,并从 Python 3.3 版本开始成为语言官方内容的一部分。

    简单来说,对于每一个包含 Python 包或模块(也包括命名空间包)的目录来说,如果其不包含 __init__().py 文件,那么它就被看做是命名空间包。

    例如,前面所说的 acme 在 Python 3.3 以及更高版本中,就是一个命名空间包。使用安装工具的最小 setup.py 脚本文件如下所示:

    from setuptools import setup
    
    
    setup(
    
    name = 'acme.templating',
    
    packages = ['acme.templating'],
    
    )

    但是,直到发表本节时,setuptools.find_packages() 还不支持 PEP 420,但这在未来很可能会改变。此外,要想实现命名空间包的简单继承,显示地定义包列表是值得的。

    以前Python版本中的命名空间包

    Python 3.3 之前的版本中,虽无法使用 PEP 420 布局中的命名空间包,但仍可以使用它。旧版 Python 中,有几种方法可以将包定义成命名空间。

    最简单的方法就是为每个组件创建一个文件结构,类似于没有命名空间包的普通包布局,并将所有事情都留给 setuptools。

    因此,acme.sql 和 acme.templating 的布局示例可能如下所示:

    $tree acme.sql/
    acme.sql/
    ├───acme
    │      ├──__init__.py
    │      └───sql
    │              └──__init__.py
    └───setup.py
    
    2 directories, 3 files
    
    $tree acme.templating/
    acme.templating/
    ├───acme
    │      ├──__init__.py
    │      └───templating
    │                └──__init__.py
    └───setup.py
    
    2 directories, 3 files
    注意,acme.sql 和 acme.templating 都有一个额外的源代码文件 acme/__init__.py,这个文件必须是空的。
    


    如果我们提供 acme 作为 setuptools.setup() 函数 namespace_package 关键字参数的值,那么将会创建如下的 acme 命名空间包:

    from setuptools import setup
    
    
    setup(
    
    name = 'acme.templating',
    
    packages = ['acme.templating'],
    
    namespace_package = ['acme'],
    
    )

    当然,最简单的方法不一定是最好的,为了注册一个新的命名空间,setuptools 将会在 __init__.py 文件中调用 pkg_resources.declare_namespace() 函数,即便 __init__.py 文件是空的也会调用。

    无论如何,正如官方文档所说,你自己负责在 __init__.py 文件中声明命名空间,并且未来可能会删除 setuptools 的这个隐式行为。为了保证安全,也为了未来依然可用(future-proof),需要将下面这行代码添加到 acme/__init__.py 文件中:

    __import__('pkg_resources').declare_namespace(__name__)

    更多相关内容
  • python 命名空间

    2022-02-24 13:58:36
    命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的,它的键就是变量名,它的值就是那些变量的值。 命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,...

    一、概念介绍

    命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的,它的键就是变量名,它的值就是那些变量的值。

    命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

    例如:

    一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

    img

    二、命名空间的类型

    • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
    • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
    • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

    img

    2.1、locals
    内置函数locals(), 返回当前函数(方法)的局部命名空间

    def func(a = 1):
        b = 2
        print(locals())
        return a+b
    func()
    
    # {'a': 1, 'b': 2} 可以看出,locals返回的是个dict
    

    2.2、globals
    内置函数globals(),返回当前module的命名空间

    def func(a = 1):
        b = 2
        return a+b
    func()
    print(globals()) # globals()返回的也是个dict
    

    2.3、locals()和globals()有一个区别是,locals只读,globals可以写

    def func(a = 1):
        b = 2
        return a+b
    func()
    glos = globals()
    glos['new_variable'] = 3
    print(new_variable)
    
    # 3  , 我们并没有显示定义new_variable这个变量,只是在globals中添加了这个key,在随后的代码中,
    
    #就可以像访问一般变量一样来访问。
    
    def func(a = 1):
        b = 2
        locs = locals()
        locs['c']  = 1
        print(c)
    func()
    
    # NameError: name 'c' is not defined
    

    2.4、from module import 和 import module

    使用 import module时,module 本身被引入,但是保存它原有的命名空间,所以我们需要使用 module.name 这种方式访问它的 函数和变量。
    
    from module import这种方式,是将其它模块的函数或者变量引到当前的命名空间中,所以就不需要使用 module.name 这种方式访问其它的模块的方法了。
    

    2.5、if __name__trick
    python中的module也是对象,所有的modules都有一个内置的属性__name__,模块的__name__属性的值取决于如何使用这个模块,如果import module,那么__name__属性的值是模块的名字。如果直接执行这个模块的话,那么__name__属性的值就是默认值__main__。

    三、命名空间查找顺序

    当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

    1、局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。
    2、全局命名空间:特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
    3、内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
    4、如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'aa' is not defined。
    
    ##对于闭包来说,这里有一点区别,如果在local namespace中找不到变量的话,还会去父函数的local namespace中找变量。
    
    info = "Adress : "
    def func_father(country):
        def func_son(area):
            city= "Shanghai " #此处的city变量,覆盖了父函数的city变量
            print(info + country + city + area)
        city = " Beijing "
        #调用内部函数
        func_son("ChaoYang ");
    
    func_father("China ")
    
    #输出:Adress : China Shanghai ChaoYang
    # 以上示例中,info在全局命名空间中,country在父函数的命名空间中,city、area在自己函数的命名空间中
    

    四、命名空间的生命周期

    不同的命名空间在不同的时刻创建,有不同的生存期。

    1、内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。
    2、模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。
    3、当函数被调用时创建一个局部命名空间,当函数返回结果 或 抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。
    

    Python 的一个特别之处在于其赋值操作总是在最里层的作用域。赋值不会复制数据——只是将命名绑定到对象。删除也是如此:“del y” 只是从局部作用域的命名空间中删除命名 y 。事实上,所有引入新命名的操作都作用于局部作用域。

    示例:

    i=1
    def func2():
        i=i+1
     
    func2();
    #错误:UnboundLocalError: local variable 'i' referenced before assignment
    

    由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。

    def func3():
      y=123
      del y
      print(y)
    
    func3()
    #错误:UnboundLocalError: local variable 'y' referenced before assignment
    #去掉"del y"语句后,运行正常
    

    五、参考文档

    1、https://www.runoob.com/python3/python3-namespace-scope.html

    2、https://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html

    3、https://blog.csdn.net/u012436149/article/details/72819539

    展开全文
  • Python命名空间和作用域 总结 emmm,这一块讲了2个内容,一个是命名空间,一个是作用域。一个一个说吧 命名空间 A namespace is a mapping from names to objects.Most namespaces are currently implemented as ...
  • python中,函数、模块等都有自己的命名空间: 局部命名空间(local namespace):即函数中定义的名称 —— 包括函数中的变量、参数、局部变量等; 全局命名空间(global namespace):即模块中定义的名称 —— ...
  • Python命名空间详解

    2021-01-21 17:34:14
    通俗的来说,Python中所谓的命名空间可以理解为一个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python命名空间需要掌握三条规则: 第一,赋值(包括显式赋值和隐式赋值...
  • 主要介绍了python命名空间(namespace)简单介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • python命名空间

    万次阅读 多人点赞 2017-05-31 13:29:53
    python使用命名空间记录变量。python中的命名空间就像是一个dict,key是变量的名字,value是变量的值。 python中,每个函数都有一个自己的命名空间,叫做local namespace,它记录了函数的变量。 python中,每个...

    python使用命名空间记录变量。python中的命名空间就像是一个dictkey是变量的名字,value是变量的值。

    • python中,每个函数都有一个自己的命名空间,叫做local namespace,它记录了函数的变量。
    • python中,每个module有一个自己的命名空间,叫做global namespace,它记录了module的变量,包括 functions, classes 和其它imported modules,还有 module级别的 变量和常量。
    • 还有一个build-in 命名空间,可以被任意模块访问,这个build-in命名空间中包含了build-in functionexceptions

    python中的某段代码要访问一个变量x时,python会在所有的命名空间中寻找这个变量,查找的顺序为:

    • local namespace - 指的是当前函数或者当前类方法。如果在当前函数中找到了变量,停止搜索
    • global namespace - 指的是当前的模块。如果在当前模块中找到了变量,停止搜索
    • build-in namespace - 如果在之前两个namespace中都找不到变量xpython会假设xbuild-in的函数或者变量。如果x不是内置函数或者变量,python会报错NameError

    对于闭包来说,这里有一点区别,如果在local namespace中找不到变量的话,还会去父函数的local namespace中找变量。

    locals

    内置函数locals(), 返回当前函数(方法)的局部命名空间

    def func(a = 1):
        b = 2
        print(locals())
        return a+b
    func()
    # {'a': 1, 'b': 2} 可以看出,locals返回的是个dict

    globals

    内置函数globals(),返回当前module的命名空间

    def func(a = 1):
        b = 2
        return a+b
    func()
    print(globals()) # globals()返回的也是个dict

    locals()和globals()有一个区别是,locals只读,globals可以写

    def func(a = 1):
        b = 2
        return a+b
    func()
    glos = globals()
    glos['new_variable'] = 3
    print(new_variable)
    # 3  , 我们并没有显示定义new_variable这个变量,只是在globals中添加了这个key,在随后的代码中,
    #就可以像访问一般变量一样来访问。
    
    def func(a = 1):
        b = 2
        locs = locals()
        locs['c']  = 1
        print(c)
    func()
    # NameError: name 'c' is not defined

    from module import 和 import module

    • 使用import module时,module本身被引入,但是保存它原有的命名空间,所以我们需要使用module.name这种方式访问它的 函数和变量。
    • from module import这种方式,是将其它模块的函数或者变量引到当前的命名空间中,所以就不需要使用module.name这种方式访问其它的模块的方法了。

    if __name__ trick

    python中的module也是对象,所有的modules都有一个内置的属性__name__,模块的__name__属性的值取决于如何使用这个模块,如果import module,那么__name__属性的值是模块的名字。如果直接执行这个模块的话,那么__name__属性的值就是默认值__main__

    module的一些内置属性

    • __name__: 上面已经介绍过
    • __file__ : 当前module的绝对路径
    • __dict__:
    • __doc__ :
    • __package__:
    • __path__:
    展开全文
  • 主要介绍了Python命名空间的本质和加载顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • python命名空间(五分钟读懂)

    千次阅读 2020-10-29 07:45:47
    命名空间(namespace) 1.命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名空间当中 2.每一个作用域都会有一个它对应的命名空间 3.全局命名空间,用来保存全局变量。函数命名空间用来保存函数中的...

    命名空间(namespace)

    1.命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名空间当中
    2.每一个作用域都会有一个它对应的命名空间
    3.全局命名空间,用来保存全局变量。函数命名空间用来保存函数中的变量
    4.命名空间实际上就是一个字典,是一个专门用来存储变量的字典

    locals()用来获取当前作用域的命名空间

    1.在全局作用域中调用locals()则获取-全局命名空间,
    2.在函数作用域中调用locals()则获取-函数命名空间
    3.它返回的是一个字典

    globals() 函数可以用来在任意位置获取全局命名空间

    没有定义函数中

    a = [1,2,3]
    b = (4,5,6)
    c = {'c1':'7','c2':'8'}
    dalao = locals()  # 当前命名空间
    print(locals())   # 打印结果为{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x01918E20>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\Administrator\\102901.py', '__cached__': None, 'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {'c1': '7', 'c2': '8'}, 'dalao': {...}}
    print(dalao)      # 打印结果为{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x01918E20>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\Administrator\\102901.py', '__cached__': None, 'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {'c1': '7', 'c2': '8'}, 'dalao': {...}}
    print(type(dalao))# 打印结果为 <class 'dict'>
    '''
        返回的是一个字典,那么就可以向字典中添加key-value就相当于在全局中创建了一个变量(一般不建议这么做)
     'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {'c1': '7', 'c2': '8'}, 'dalao': {...}}
    '''
    print(a)           # 打印结果为[1, 2, 3]
    print(dalao['a'])  # 打印结果为[1, 2, 3]
    '''向dalao中修改一个key-value'''
    dalao['c'] = 1000 # 向字典中添加key-value就相当于在全局中创建了一个变量(一般不建议这么做)
    print(c)          # 打印结果为1000
    

    有定义的函数中

    a = 1
    def fn1():
        a = 10
        print(locals()) # 输出函数内的字典# 在函数内部调用locals()会获取到函数的命名空间
        locals()['b'] = 20 # 可以通过方法来操作函数的命名空间,但是也是不建议这么做
        print(locals()) # 输出函数内的字典# 在函数内部调用locals()会获取到函数的命名空间
    
    fn1() 
    '''结果为
    {'a': 10}
    {'a': 10, 'b': 20}
     '''
    print(locals()) # 输出全局的字典
    '''结果为
     {'__name__': '__main__', 
     '__doc__': None,
     '__package__': None,
     '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x029DAF58>,
     '__spec__': None,
     '__annotations__': {},
     '__builtins__': <module 'builtins' (built-in)>,
     '__file__': 'C:\\Users\\Administrator\\Desktop\\102902.py',
     '__cached__': None, 
     'a': 1,
     'fn1': <function fn1 at 0x02DEF3D0>}
    '''
    

    globals() 函数可以用来在任意位置获取全局命名空间

    例子:

    a = 1
    def fn1():
        a = 10
        print(locals())# 第1次打印内部的命名空间字典 
        print(globals())# 第一次打印全局变量
        globals()['a'] = 20     # 在函数内修改全局变量的内容
        print(globals())# 第二次打印全局变量
        print(locals()) # 第2次打印内部的命名空间字典
    fn1() 
    # 输出结果为
    {'a': 10}
    {省略内容, 'a': 1, 'fn1': <function fn1 at 0x02BFF3D0>}
    {省略内容, 'a': 20, 'fn1': <function fn1 at 0x02BFF3D0>}
    {'a': 10}
    
    # 省略内容
    '''
    完整的第一次打印全局变量
    省略内容开始
    {'__name__': '__main__',
     '__doc__': None,
     '__package__': None,
     '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x007BAF58>,
     '__spec__': None,
     '__annotations__': {},
     '__builtins__': <module 'builtins' (built-in)>,
     '__file__': 'C:\\Users\\Administrator\\Desktop\\102902.py',
     '__cached__': None,# 结束省略内容
     'a': 1,
     'fn1': <function fn1 at 0x022FF3D0>}
    '''
    
    展开全文
  • Python命命名名空空间间及及作作用用域域原原理理实实例例解解析析 这篇文章主要介绍了Python命名空间及作用域原理实例解析,文中通过示例代码介绍的非常详细对大家的学习或 工作具有一定的参考学习价值,需要的朋友...
  • 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字、对象及其绑定的文章。 1. 命名空间 1.1 什么是命名空间 Namespace命名空间,也称名字空间,是从名字到对象的映射。Python中,大部分的命名...
  • 关于python中的命名空间,可以先看官方文档里的一个说明 A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 1.namespace(命名空间)是从名称到...
  • python 类的命名空间

    2022-04-02 13:42:32
    目录python 类的命名空间一、类对象提供的默认行为二、类的属性和命名空间 vs 实例的属性和命名空间 一、类对象提供的默认行为 要想了解类的命名空间,首先我们得了解类对象提供的默认行为。 当我们执行class语句...
  • python中的命名空间分三种:内置的命名空间,在启动解释器的时候自动加载进内存的各种名字所在的空间,比如print,input等不需要定义就可以使用的名字全局命名空间,就是从上到下所有我们定义的变量名和函数名所在的...
  • 问题 你想解析某个XML文档,文档中使用了XML命名空间。 解决方案 考虑下面这个使用了命名空间的文档: <?xml version="1.0" encoding="utf-8"?> <author>David Beazley <...</h1>
  • 命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 “命名空间” 有必要了解一下。 全局变量 &amp; 局部变量 ...
  • Python 命名空间

    2015-02-26 17:27:19
    通俗的来说,Python中所谓的命名空间可以理解为一个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python命名空间需要掌握三条规则: 第一,赋值(包括显式赋值和隐式赋值...
  • 一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。 每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。 Python会...
  • 命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 “命名空间” 有必要了解一下。 全局变量 & 局部变量 全局变量和...
  • 主要介绍了Python Django 命名空间模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 命名空间几乎所有的语言都有类似的机制,在Python命名空间分三种,局部、全局和内建。或(四种,嵌套的局部作用域在Python中叫闭包 Enclosing)定义名称到对象的映射。命名空间是一个字典的实现,键为变量名,值是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,000
精华内容 42,800
关键字:

python命名空间