• 名字空间的含义。名称绑定、名称解析


    一个作用域对应一个名字空间  注:名字空间相当于(key,value)字典

    一个模块是一个作用域,模块中有一个名字空间

    一个类是一个作用域,类中有一个名字空间

    一个函数内部是一个作用域,对应一个名字空间

    名称绑定相当于往字典中添加(key,value)

    名称绑定的情形: 

    1、变量赋值,定义函数,定义类的时候

    2、传参的时候,名称绑定到函数的作用域

    3、import语句的时候,把import后面的名称绑定到当前名称空间

    4、其他情况,略

    名称解析的过程:

    相当于查找字典中的(key,value)

    查找顺序为LEGB(local, Enclosing,Globle,Build-in)   名称绑定到一个代码块中,那么是局部变量,如果绑定到模块级别那么就是全局变量

    #Enclosing:非局部也非全局变量
    #两个嵌套函数,内层函数可能搜索外层函数的namespace但该namespace对内层函数而言既非全局也非局部
    def  closure(str):     # str对内层来说即非全局也非局部
      def decrator(func):
        def wrapper():
          ....
          if (str)  # 解析的时候先查找本地的str(local),再查找Enclosing的str
            func()
          else
            ....
          ....
        return wrapper
      return decrator

    如果先解析到了变量,而绑定在解析之后,会报错UnboundLocalError 

    4.内建名字空间

    在查找内建名字空间的时候,会访问当前代码块的全局名字空间中的 __builtins__名字,这个名字引用的是一个名字字典或者是一个模块。在 __main__ 模块中, __builtins__ 的引用是内建模块 builtins,然而,如果是在其他模块中, __builtins__ 引用的是 builtins 模块的名字字典。

    print(globals())

    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000211B0F0>, '__spec__': None, '__annotations__': {},

    '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/PycharmProjects/15group/level_2/day2/core/mm/aaad.py', '__cached__': None}
    import builtins
    print(builtins.abs(-2))  #内建模块可以调用内置方法

    注意:
    CPython的实现中,不能手动修改 __builtins__ 这个变量,如果需要覆盖这个内建名字空间中的名字,需要导入 builtins 模块,然后修改这个模块中相应的属性。

  • 相关阅读:
    JS如何判断是否已经引入某个css或是js?
    FILTER:progid:DXImageTransform.Microsoft.Gradient使用
    根据ip查询ip归属地
    java判断是否是合法IP
    jQuery下实现等待指定元素加载完毕(可改成纯js版)
    jsp 循环数字
    jsp获取当前日期
    MyBatis In的使用
    给半径求圆面积
    实现一个数值加法函数,返回两个数字的和。要求能进行参数验证,若参数不是数字或为空则抛出异常。
  • 原文地址:https://www.cnblogs.com/revo/p/7155747.html
Copyright © 2020-2023  润新知