欢迎关注 “小白玩转Python”,发现更多 “有趣”
引言
当一个程序变大时,读取代码就变成了一项困难的工作。即使是一些简单的任务也会很困难。例如:
如何检查一个大型函数或类的所有变量名和值?
如何获得特定对象的有效属性列表?
如何快速查看当前脚本的所有变量名和值?
当然,我们可以一行一行地查代码,记住这些名字,或者把它们写在纸上。然而,这一点也不 Python !
读代码比写代码更难。
函数1: globals()
顾名思义,globals()函数将显示全局范围的信息。
例如,如果我们打开 Python 控制台并输入 globals () ,就会返回一个包含全局作用域中所有变量名称和值的字典。
>>> globals()
{'__name__': '__main__', '__doc__': None, ...}
(本文中的一些输出例子被缩写为... ,以使它们更加整洁和易读。)
如果我们加上一个变量:
>>> Master = "Yang"
>>> globals
{'__name__': '__main__', '__doc__': None, ... ,'Master': 'Yang'}
因为 globals() 函数只返回一个字典。我们可以通过操作字典来获得一些我们感兴趣的特定数据:
>>> [n for n in globals() if not n.startswith('__')]
['sys', 'Master']
如上所示,我们可以通过一个列表解析来获得所有的变量名。
函数2: locals()
在理解了 globals() 之后,locals() 函数只是小菜一碟。顾名思义,它将返回一个包括所有局部名称和值的字典。
def top_developer():
name = "Yang"
country = "UK"
print(locals())
top_developer()
# {'name': 'Yang', 'country': 'UK'}
顺便说一下,如果我们在全局范围中调用 locals() ,结果与 globals()完全相同。
>>> globals() is locals()
True
函数3: vars()
vars() 函数将返回 _dict_,这是一个用于存储对象属性的字典。其结果与直接调用 _dict_ 相同。
class TopDeveloper:
def __init__(self):
self.name = "Yang"
self.country = "UK"
me = TopDeveloper()
print(vars(me))
# {'name': 'Yang', 'country': 'UK'}
print(vars(me) is me.__dict__)
# True
并不是所有对象都必须具有 _dict_,因此我们只能在部分对象中使用 vars()方法。
year = 2020
vars(year)
# Traceback (most recent call last):
# File "<input>", line 1, in <module>
# TypeError: vars() argument must have __dict__ attribute
如上例所示,int 类型对象不包含 _dict_,因此如果对其使用 vars() ,将引发 TypeError。
函数4: dir()
dir() 函数帮助我们展示相应范围内的名称列表。
class TopDeveloper:
def __init__(self):
self.name = "Yang"
self.country = "UK"
me = TopDeveloper()
print(dir(me))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'country', 'name']
实际上,dir 方法是在内部调用 _dir_() 。
class TopDeveloper:
def __init__(self):
self.name = "Yang"
self.country = "UK"
def __dir__(self):
return [1, 2, 3]
me = TopDeveloper()
print(dir(me))
# [1, 2, 3]
如上所示,如果我们更改 _dir_ 的工作方式,dir() 的结果也将会改变。
总结
这四个内置函数是我们显示名称和值的得力助手。它们的常见使用场景是在 Python 控制台中用于在我们读取程序时探索脚本或对象。
· END ·
HAPPY LIFE