主要内容
- __dict__
- locals()
- globals()
- 内置名称空间
- 有趣的问题
今天遇到一行这样的代码
locals().update(importlib.import_module("PARAMETERS").__dict__)
dict
以python的字典形式显示模块的所有属性(
attribute
),接下来我们来用实验来见证“奇迹”:
模块:a.py
print("hello world")
def add(a, b):
res = a+ b
print("{} + {} = {}".format(a, b, res))
return res
def subtract(a, b):
res = a - b
print("{} - {} = {}".format(a, b, res))
return res
执行模块b.py
import a
print(a.__dict__)
print(a.add(3, 4))
结果
{'__name__': 'a', 'subtract': <function subtract at 0x7f2e9e138b70>, '__builtins__','add': <function add at 0x7f2e9e1d1bf8>, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x7f2e9e1440b8>, '__file__': '/home/fourye/PycharmProjects/Test/a.py'}
实验说明:
__dict__
使用来显示模块的所有属性,以及属性的相关信息,也包括在属性在内存中的地址。
名称空间
在理解locals() 和 global() 这两个函数的时候,我们首先要理解python的名称空间,通过名称空间来搜索当前环境(局部或是全局)中的变量。而名称空间本质上就是一个字典。
locals()
每个函数都有自己的局部名称空间, 它记录了函数的参数和局部定义的变量,方法等。
实验胜于雄辩:
def mean(a, b):
def sum(a, b):
return a + b
number = 2
res = sum(a, b) / number
print(locals())
return res
mean(4, 6)
执行结果
{'b': 6, 'res': 5.0, 'sum': <function mean.<locals>.sum at 0x7f1018209158>, 'a': 4, 'number': 2}
globals()
在每个模块中都会记录这自己的的全局变量,其中包括函数,类,导入的模块,模块级别的变量和常量。
接下来我们就用实验擦亮你的“狗眼”:
def mean(a, b):
def sum(a, b):
return a + b
number = 2
res = sum(a, b) / number
return res
class Hello(object):
def __init__(self):
print("class Hello")
def hello(self):
print("hello world")
a = 3
import os
print(globals())
实验结果:
{'__package__': None, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/fourye/PycharmProjects/Test/c.py', '__cached__': None, 'a': 3, 'os': <module 'os' from '/usr/lib/python3.4/os.py'>, '__spec__': None, '__name__': '__main__', 'Hello': <class '__main__.Hello'>, '__doc__': None, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x7f2774d204a8>, 'mean': <function mean at 0x7f2774d4bbf8>}
内置名称空间
任何模块都可以访问,它存放在内置的函数(
built−infunction
)和异常(
Built−inException
)。
有趣的问题
在模块的globas() 和 locals() 会是怎么样?
咋办呢实验拜:
if globals() == locals():
print("ha ha")
实验结果:
ha ha
那下面的怎么理解?
locals().update(importlib.import_module("PARAMETERS").__dict__)
答案:
实践吧,骚年