《编写高质量Python代码的59个有效方法》——第18条:用数量可变的位置参数减少视觉杂讯

简介:

本节书摘来自华章社区《编写高质量Python代码的59个有效方法》一书中的第18条:用数量可变的位置参数减少视觉杂讯,作者[美]布雷特·斯拉特金(Brett Slatkin),更多章节内容可以访问云栖社区“华章社区”公众号查看

第18条:用数量可变的位置参数减少视觉杂讯
令函数接受可选的位置参数(由于这种参数习惯上写为*args,所以又称为star args,星号参数),能够使代码更加清晰,并能减少视觉杂讯(visual noise)。
例如,要定义log函数,以便把某些调试信息打印出来。假如该函数的参数个数固定不变,那它就必须接受一段信息及一份含有待打印值的列表。

即便没有值要打印,只想打印一条消息,调用者也必须像上面那样,手工传入一份空列表。这种写法既麻烦,又显得杂乱。最好是能令调用者把第二个参数完全省略掉。若想在Python中实现此功能,可以把最后那个位置参数前面加个*,于是,对于现在的log函数来说,只有第一个参数message是调用者必须要指定的,该参数后面,可以跟随任意数量的位置参数。函数体不需要修改,只需修改调用该函数的代码。

如果要把已有的列表,传给像log这样带有变长参数的函数,那么调用的时候,可以给列表前面加上*操作符。这样Python就会把这个列表里的元素视为位置参数。

接受数量可变的位置参数,会带来两个问题。
第一个问题是,变长参数在传给函数时,总是要先转化成元组(tuple)。这就意味着,如果用带有*操作符的生成器为参数,来调用这种函数,那么Python就必须先把该生成器完整地迭代一轮,并把生成器所生成的每一个值,都放入元组之中。这可能会消耗大量内存,并导致程序崩溃。

只有当我们能够确定输入的参数个数比较少时,才应该令函数接受*arg式的变长参数。在需要把很多字面量或变量名称一起传给某个函数的场合,使用这种变长参数,是较为理想的。该参数主要是为了简化程序员的编程工作,并使得代码更加易读。
使用*arg参数的第二个问题是,如果以后要给函数添加新的位置参数,那就必须修改原来调用该函数的那些旧代码。若是只给参数列表前方添加新的位置参数,而不更新现有的调用代码,则会产生难以调试的错误。

问题在于:上面的第二条log语句是以前写好的,当时的log函数还没有sequence参数,现在多了这个参数,使得7从values值的一部分,变成了message参数的值。这种bug很难追踪,因为现在这段代码仍然可以运行,而且不抛出异常。为了彻底避免此类情况,我们应该使用只能以关键字形式指定的参数(keyword-only argument),来扩展这种接受*args的函数(参见本书第21条)。
要点
在def语句中使用*args,即可令函数接受数量可变的位置参数。
调用函数时,可以采用*操作符,把序列中的元素当成位置参数,传给该
函数。
对生成器使用*操作符,可能导致程序耗尽内存并崩溃。
在已经接受*args参数的函数上面继续添加位置参数,可能会产生难以排查的bug。

相关文章
|
4天前
|
并行计算 C语言 开发者
优化Python代码的五大技巧
Python作为一种流行的编程语言,在各种应用场景中广泛使用。然而,随着项目规模的增长和需求的变化,Python代码的性能和可维护性也成为了关键问题。本文将介绍优化Python代码的五大技巧,帮助开发者提升代码效率和质量。
|
1天前
|
人工智能 Python
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
14 0
|
1天前
|
数据安全/隐私保护 Python
Python中的装饰器:提升代码可读性和灵活性
Python中的装饰器是一种强大的编程工具,能够提升代码的可读性和灵活性。本文将深入探讨装饰器的原理和用法,以及如何利用装饰器来简化代码、实现日志记录、权限控制等功能,从而让你的Python代码更加优雅和高效。
|
6天前
|
存储 关系型数据库 MySQL
Python搭建代理IP池实现存储IP的方法
Python搭建代理IP池实现存储IP的方法
|
6天前
|
Python
Python动态IP代理防止被封的方法
Python动态IP代理防止被封的方法
|
6天前
|
数据采集 存储 安全
python检测代理ip是否可用的方法
python检测代理ip是否可用的方法
|
7天前
|
数据安全/隐私保护 Python
Python中的装饰器:提升代码可读性与灵活性
Python中的装饰器是一种强大的工具,可以在不改变函数原有逻辑的情况下,为函数添加额外的功能。本文将介绍装饰器的基本概念和用法,并通过实例演示如何利用装饰器提升代码的可读性和灵活性,使代码更加简洁、易于维护。
|
7天前
|
BI 开发者 数据格式
Python代码填充数据到word模板中
【4月更文挑战第16天】
|
8天前
|
数据可视化 测试技术 Python
在Python和R中使用交叉验证方法提高模型性能
在Python和R中使用交叉验证方法提高模型性能
20 0
|
8天前
|
存储 监控 开发工具
对象存储OSS产品常见问题之python sdk中的append_object方法支持追加上传xls文件如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
38 9

热门文章

最新文章