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

开发 后端
为了让我们的生活更轻松,Python 提供了四个有用的内置函数来帮助我们方便地显示特定变量名称和值。

[[426003]]

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

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

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

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

为了让我们的生活更轻松,Python 提供了四个有用的内置函数来帮助我们方便地显示特定变量名称和值 。

函数 1: globals()

顾名思义,该 globals()函数将显示全局变量信息 。

例如,如果我们打开 Python 控制台并输入 globals(), 将返回如下结果:

  1. Python 3.8.5 (v3.8.5:580fbb018f, Jul 20 2020, 12:11:27) 
  2. [Clang 6.0 (clang-600.0.57)] on darwin 
  3. Type "help""copyright""credits" or "license" for more information. 
  4. >>> globals() 
  5. {'__name__''__main__''__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>} 
  6. >>> 

如果我们添加一个变量:

  1. >>> name = 'Python七号' 
  2. >>> globals() 
  3. {'__name__''__main__''__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'name''Python七号'
  4. >>> 

由于该 globals()函数只返回一个包含全局变量的字典。我们可以操纵这个 dict 来获取一些我们感兴趣的数据:

  1. >>> [n for n in globals() if not n.startswith('__')] 
  2. ['name'
  3. >>> 

如上例所示,我们使用列表推导式来获取所有非双下划线的变量名称。

函数 2:locals()

了解 globals()之后, locals()函数就是小菜一碟。顾名思义,它将返回一个包含所有本地变量和值的字典。

顺便说一下,如果我们locals()在全局范围内调用 ,结果与 globals()相同。

  1. >>> globals()  == locals() 
  2. True 
  3. >>> 

函数 3:vars()

该 vars()函数将返回 __dict__,这是一个用于存储对象属性的字典。其结果与直接调用对象的__dict__方法产生的结果相同 。

  1. >>> vars() 
  2. {'__name__''__main__''__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'name''Python七号'
  3. >>> class A: 
  4. ...     name = 'Python七号' 
  5. ... 
  6. >>> 
  7. >>> vars(A) 
  8. mappingproxy({'__module__''__main__''name''Python七号''__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}) 
  9. >>> 
  10. >>> 

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

  1. >>> num = 1 
  2. >>> vars(num) 
  3. Traceback (most recent call last): 
  4.   File "<stdin>", line 1, in <module> 
  5. TypeError: vars() argument must have __dict__ attribute 
  6. >>> 

如上例所示, int类型对象不包含 __dict__,因此如果我们vars()将引发TypeError 。

函数 4:dir()

该 dir()函数帮助显示模块或对象内的名称列表。

  1. >>> dir(A) 
  2. ['__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'
  3. >>> dir(num) 
  4. ['__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'
  5. >>> dir() 
  6. ['A''__annotations__''__builtins__''__doc__''__loader__''__name__''__package__''__spec__''name''num'
  7. >>> 

实际上,该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七号公众号。

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2021-10-24 08:45:09

数据安全云计算网络安全

2015-08-17 16:34:13

2015-07-23 10:25:27

android代码质量

2020-08-25 08:47:15

开源软件技巧

2009-03-13 09:39:34

JavaScript函数调用规则

2023-09-26 12:34:29

Python迭代过滤函数

2023-12-13 13:00:57

2023-09-13 16:34:47

Java工具开发

2023-11-23 13:50:00

Python代码

2019-06-26 15:41:26

AI云原生云迁移

2022-08-02 10:33:11

JavaScript代码

2022-05-04 12:44:57

Python编程语言

2022-06-20 10:37:31

物联网智能安防智能建筑

2020-10-29 08:35:06

Pandas函数Python

2022-10-31 07:09:15

拷贝代码项目

2021-01-14 10:48:05

技术RPCRS

2011-06-14 18:13:05

网站分析

2009-05-22 10:28:07

2014-01-21 14:19:30

多看阅读移动阅读

2023-12-04 13:21:00

PandasPython
点赞
收藏

51CTO技术栈公众号