专栏首页Python七号4 个让 Python 代码更容易阅读的函数

4 个让 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__': <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 的自省函数。

与自省相关的主要方法:

  • 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七号(PythonSeven),作者:somenzz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python的代码风格

    随着你编写的程序越来越长,有必要了解一些代码格式设置约定。请花时间让你的代码尽可能易于阅读;让代码易于阅读有助于你掌握程序是做什么的,也可以帮助他人理解你编写的...

    狼啸风云
  • 写出漂亮 Python 代码的 20条准则

    通常,当我们在学校学习时,编程美学不是一个关键问题。用 Python 写代码时,个人也会遵循自己的风格。然而,当我们必须花大把时间来理解一个人的隐式代码时,这项...

    公众号机器学习与生成对抗网络
  • 我喜欢 Python 的5个原因【Programming(Python)】

    我从1998年就开始使用Python,当时它是一种鲜为人知的语言。那是 Perl 在开放源代码世界中相当流行的时期,但是从我发现 Python 的那一刻起,我就...

    Potato
  • 10个技巧让你的代码更优雅

    现在写代码的门槛非常低了,少儿都开始编程了,但从代码的风格一眼看出编码水平。是的,写代码是容易的,写出易读的代码也是容易的,但写出易读、优雅、高效的代码则需要经...

    somenzz
  • Python基础教程学习路线

    Python基础教程学习路线,如果想从零基础熟练掌握python开发,你需要有一套完整的学习路线,学习Python的优势如何学习等相关的内容。接下来小编带你一起...

    python学习教程
  • 一、代码风格 1、假定你的代码需要维护2、保持一致性3、考虑对象在程序中存在的方式,尤其是那些带有数据的对象4、不要做重复工作5、让注释讲故事6、奥卡姆剃刀原则1、简洁的规则2、文档字符串3、空行4、

    刚开始学的时候就要注意编码规范了,所以整理了一下,以便养成一个编码好习惯。不然以后真的不好改。 代码被读的次数远大于被写的次数。 作为一名程序员(使用任何语言)...

    酱紫安
  • 如何写出专业的数据科学代码?你需要知道这6点

    「可重用」是什么意思?在你的数据科学职业生涯中的某个时刻,你编写的代码将被使用不止一次或两次。也许你会对一些不同的图像文件集运行相同的预处理管道,或者你有一套用...

    AI研习社
  • Python 代码风格

    1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要。 请记住可读性标准的目标是提升可读性。这些规则存在的目...

    用户1217611
  • 如何用PEP 8编写漂亮的Python代码

    Pep 8的存在是为了提高Python代码的可读性。但为什么可读性如此重要呢?为什么编写可读的代码是Python语言的指导原则之一?

    Python知识大全
  • Python高效编程之88条军规(1):编码规范、字节序列与字符串

    在微信公众号「极客起源」中输入595586,可学习全部的《Python高效编程之88条军规》系列文章。

    蒙娜丽宁
  • 创始人退休后的Python,起飞还是没落?

    今日Python 之父 Guido Van Rossum宣布退休的消息占据了多家科技媒体的版面。

    博文视点Broadview
  • Python技巧101,每个新程序员都要知道

    Python比以往任何时候都更受欢迎,人们每天都在证明Python是一种非常强大且易于学习的语言。

    AiTechYun
  • 精选26个Python实用技巧,想秀技能先Get这份技术列表!

    【导读】Python 虽然是脚本语言,但是因为其易学,迅速成为科学家的工具,从而积累了大量的工具库、架构,人工智能涉及大量的数据科学,用 Python 是很自然...

    AI科技大本营
  • 精选26个Python实用技巧,想秀技能先Get这份技术列表!

    【导读】Python 虽然是脚本语言,但是因为其易学,迅速成为科学家的工具,从而积累了大量的工具库、架构,人工智能涉及大量的数据科学,用 Python 是很自然...

    CDA数据分析师
  • 精选26个Python实用技巧,想秀技能先Get这份技术列表!

    Python 虽然是脚本语言,但是因为其易学,迅速成为科学家的工具,从而积累了大量的工具库、架构,人工智能涉及大量的数据科学,用 Python 是很自然的事。磨...

    昱良
  • 在Atom中设置Python开发环境

    当然,网络上有很多很棒的文本编辑器。Sublime Text,Bracket,Atom等。就我个人而言,我一直都是Atom的粉丝,因为它是完全免费的,并且它有...

    teachertian
  • Python工匠:如何更好地使用变量

    编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

    腾讯NEXT学位
  • 零基础学编程031:Python与其它语言最不同的一条语法规则

    有C或JAVA其它编程语言基础的人可能对Python中的这条语法规则最不适应:Python中的缩进是有语法含义的,它用来表示一个代码块(code block)。...

    申龙斌
  • 如何保护你的 Python 代码 (一)—— 现有加密方案

    花下猫语:Python 是一种入门容易的语言,初学者就可以轻松地完成各种任务,但是,Python 的用处与边界也很广,有太多的话题值得我们去研究探索。今天,我继...

    Python猫

扫码关注云+社区

领取腾讯云代金券