栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间:发布时间: 百科书网 趣学号

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

  • 如何快速查看当前脚本的所有变量名和值?

  • 如何检查大型函数或类的所有变量名称和值?

  • 如何获取特定对象的有效属性列表?

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

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

为了让我们的生活更轻松,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__': , '__spec__': None, '__annotations__': {}, '__builtins__': }
>>>

如果我们添加一个变量:

>>> name = 'Python七号'
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '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__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'name': 'Python七号'}
>>> class A:
...     name = 'Python七号'
...
>>>
>>> vars(A)
mappingproxy({'__module__': '__main__', 'name': 'Python七号', '__dict__': , '__weakref__': , '__doc__': None})
>>>
>>>

不是所有对象都有 __dict__方法,因此vars()只能在部分对象中使用。

>>> num = 1
>>> vars(num)
Traceback (most recent call last):
  File "", line 1, in 
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 的内省函数也可以在运行时动态检查对象的类型和方法,可以帮助我们检查代码,也方便我们编写出灵活可扩展的程序。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/273031.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号