四个让 Python 代码较易阅读的函数
发布时间:2021-11-05 13:19:30 所属栏目:语言 来源:互联网
导读:当程序代码行变多时,阅读代码变得困难。即使是一些简单的任务也会很困难。例如: 如何快速查看当前脚本的所有变量名和值? 如何检查大型函数或类的所有变量名称和值? 如何获取特定对象的有效属性列表? 当然,我们可以逐行查找代码并记住名称或将它们写在草
当程序代码行变多时,阅读代码变得困难。即使是一些简单的任务也会很困难。例如: 如何快速查看当前脚本的所有变量名和值? 如何检查大型函数或类的所有变量名称和值? 如何获取特定对象的有效属性列表? 当然,我们可以逐行查找代码并记住名称或将它们写在草稿纸中。但是,这根本不是高效的,也不轻松。 阅读代码比编写代码更难。— 乔尔·斯波尔斯基 为了让我们的生活更轻松,Python 提供了四个有用的内置函数来帮助我们方便地显示特定变量名称和值 。 函数 1: globals() 顾名思义,该 globals()函数将显示全局变量信息 。 例如,如果我们打开 Python 控制台并输入 globals(), 将返回如下结果: Python 3.8.5 (v3.8.5:580fbb018f, Jul 20 2020, 12:11:27) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>} >>> 如果我们添加一个变量: >>> name = 'Python七号' >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'name': 'Python七号'} >>> 由于该 globals()函数只返回一个包含全局变量的字典。我们可以操纵这个 dict 来获取一些我们感兴趣的数据: >>> [n for n in globals() if not n.startswith('__')] ['name'] >>> 如上例所示,我们使用列表推导式来获取所有非双下划线的变量名称。 函数 2:locals() 了解 globals()之后, locals()函数就是小菜一碟。顾名思义,它将返回一个包含所有本地变量和值的字典。 顺便说一下,如果我们locals()在全局范围内调用 ,结果与 globals()相同。 >>> globals() == locals() True >>> 函数 3:vars() 该 vars()函数将返回 __dict__,这是一个用于存储对象属性的字典。其结果与直接调用对象的__dict__方法产生的结果相同 。 >>> vars() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'name': 'Python七号'} >>> class A: ... name = 'Python七号' ... >>> >>> vars(A) mappingproxy({'__module__': '__main__', 'name': 'Python七号', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}) >>> >>> 不是所有对象都有 __dict__方法,因此vars()只能在部分对象中使用。 >>> num = 1 >>> vars(num) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: vars() argument must have __dict__ attribute >>> 如上例所示, int类型对象不包含 __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 的自省函数。 ![]() (编辑:锡盟站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐