您现在的位置是:亿华云 > 应用开发

四个让 Python 代码更容易阅读的函数

亿华云2025-10-02 19:56:08【应用开发】7人已围观

简介当程序代码行变多时,阅读代码变得困难。即使是一些简单的任务也会很困难。例如:如何快速查看当前脚本的所有变量名和值? 如何检查大型函数或类的所有变量名称和值? 如何获取特定对

当程序代码行变多时,个让更容阅读代码变得困难。代码读即使是易阅一些简单的任务也会很困难。例如:

如何快速查看当前脚本的函数所有变量名和值? 如何检查大型函数或类的所有变量名称和值? 如何获取特定对象的有效属性列表?

当然,我们可以逐行查找代码并记住名称或将它们写在草稿纸中。个让更容但是代码读,这根本不是易阅高效的,也不轻松。函数

阅读代码比编写代码更难。个让更容— 乔尔·斯波尔斯基

为了让我们的代码读生活更轻松,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()函数就是小菜一碟。云南idc服务商顾名思义,它将返回一个包含所有本地变量和值的字典。

顺便说一下,如果我们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 的自省函数。

与自省相关的主要方法:

hasattr(object, name)检查对象是否具体 name 属性。返回 bool. getattr(object, name, default)获取对象的name属性。 setattr(object, name, default)给对象设置name属性 delattr(object, name)给对象删除name属性 isinstance(name, object)检查name是不是object对象 type(object)查看对象的类型 callable(object)判断对象是否是可调用对象

最后 

这四个内置函数是我们显示名称和值的有用工具。它们的常见使用场景是在 Python 控制台中使用,以在我们阅读程序时探索脚本或对象。Pytho 的内省函数也可以在运行时动态检查对象的类型和方法,可以帮助我们检查代码,也方便我们编写出灵活可扩展的程序。

本文转载自微信公众号「Python七号」,可以通过以下二维码关注。转载本文请联系Python七号公众号。

源码下载

很赞哦!(16)