当程序代码行数增加时,阅读代码变得困难。即使是一些简单的任务也可能很困难。例如:如何快速查看当前脚本的所有变量名和值?如何查看一个大函数或类的所有变量名和值?写在草稿纸上。然而,这根本没有效率,也不容易。阅读代码比编写代码更难。—JoelSpolski为了让我们的生活更轻松,Python提供了四个有用的内置函数来帮助我们方便地显示特定的变量名和值。函数一:globals()顾名思义,globals()函数会显示全局变量信息。例如我们打开Python控制台,输入globals(),会返回如下结果:Python3.8.5(v3.8.5:580fbb018f,Jul202020,12:11:27)[Clang6.0(clang-600.0.57)]ondarwinType"help","copyright","credits"or"license"获取更多信息。>>>globals(){'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':,'__spec__':None,'__annotations__':{},'__builtins__':}>>>如果我们添加一个变量:>>>name='PythonSeven'>>>globals(){'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':,'__spec__':None,'__annotations__':{},'__builtins__':,'name':'PythonNo.7'}>>>因为globals()函数只返回一个包含全局变量的字典。我们可以操作这个字典来获取一些我们感兴趣的数据:>>>[nforninglobals()ifnotn.startswith('__')]['name']>>>如上例所示,我们使用列表理解来获取所有不是双下划线的变量名。函数二:locals()了解了globals()之后,locals()函数就小菜一碟了。顾名思义,它将返回一个包含所有局部变量和值的字典。顺便说一句,如果我们在全局范围内调用locals(),结果与globals()相同。>>>globals()==locals()True>>>函数三:vars()vars()函数会返回__dict__,这是一个字典,用来存放对象的属性。结果与直接调用对象的__dict__方法产生的结果相同。>>>vars(){'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':,'__spec__':None,'__annotations__':{},'__builtins__':,'name':'PythonSeven'}>>>classA:...name='PythonSeven'...>>>>>>vars(A)mappingproxy({'__module__':'__main__','name':'PythonSeven','__dict__':,'__weakref__':,'__doc__':None})>>>>>>不是所有的对象都有__dict__方法,所以vars()只能在部分对象中使用。>>>num=1>>>vars(num)Traceback(mostrecentcalllast):File"",line1,inTypeError:vars()argumentmusthave__dict__attribute>>>如上例所示,int类型object不包含__dict__,因此如果我们使用vars()将引发TypeError。函数4:dir()dir()函数有助于显示模块或对象中的名称列表。>>>dir(A)['__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__','name']>>>dir(num)['__abs__','__add__','__and__','__bool__','__ceil__','__class__','__delattr__','__dir__','__divmod__','__doc__','__eq__','__float__','__floor__','__floordiv__','__format__','__ge__','__getattribute__','__getnewargs__','__gt__','__hash__','__index__','__init__','__init_subclass__','__int__','__invert__','__le__','__lshift__','__lt__','__mod__','__mul__','__ne__','__neg__','__new__','__or__','__pos__','__pow__','__radd__','__rand__','__rdivmod__','__reduce__','__reduce_ex__','__repr__','__rfloordiv__','__rlshift__','__rmod__','__rmul__','__ror__','__round__','__rpow__','__rrshift__','__rshift__','__rsub__','__rtruediv__','__rxor__','__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__truediv__','__trunc__','__xor__','as_integer_ratio','bit_length','conjugate','denominator','from_bytes','imag','numerator','real','to_bytes']>>>dir()['A','__annotations__','__builtins__','__doc__','__loader__','__name__','__package__','__spec__','name','num']>>>其实如上所示__dir__()内部调用了dir方法,如果我们改变了__dir__的工作方式,结果dir()也会改变。其他内省功能内省是自我反省。在编程术语中,它是指程序在运行时自行判断对象类型的能力。也可以说是反思,考察一个事物,确定它是什么,知道什么,能做什么。Django框架之所以如此灵活,是因为许多ORM类使用了Python的内省功能。内省相关的主要方法:hasattr(object,name)检查一个对象是否有特定的name属性。returnbool.getattr(object,name,default)获取对象的名称属性。setattr(object,name,default)设置对象的名称属性delattr(object,name)删除对象的名称属性isinstance(name,object)检查名称是否为对象objecttype(object)查看类型theobjectcallable(object)判断对象是否可调用?这最后四个内置函数是我们显示名称和值的有用工具。它们的一个常见使用场景是在Python控制台中,在我们阅读程序时探索脚本或对象。Python的内省功能还可以在运行时动态的检查对象的类型和方法,可以帮助我们检查代码,方便我们编写出灵活、可扩展的程序。本文转载自微信公众号“Python7号”,可通过以下二维码关注。转载本文请联系Python七号公众号。