如何编写优雅(地道)的Python代码 - 第四部分

4. 一般建议

4.1 避免重造轮子

4.1.1 学习Python标准库

编写优雅代码的一部分是自由使用标准库。不知觉地重新编码实现标准库中的功能,可能是新手常做的时。Python通常被认为包含一切。标准库中的包涵盖很广泛的领域。

使用标准库有两个明显的好处。最明显的是,给你节省了很多时间,不需要从零开始。对那些阅读和维护代码的人同样重要,如果你使用他们都熟悉的内容,将会节省很多时间。

请记住,学习和编写优雅Python的目的是编写清晰,可维护和无缺陷的代码。没有什么比重用Python核心开发人员编写的代码更能确保你代码的质量了。

在标准库中发现并修复了的错误,你的代码将随着每一个Python版本的发布而得到改善,不需要动一根手指头。

4.1.2 学会使用PyPI(Python包索引)

如果Python标准库中没有你需要的包,PyPI将会派上用场。本文写作的时候,索引库中大约有27000个包。如果你想完成一个特殊的任务,不能在PyPI找到一个相关的包,很可能不会存在。

该索引是全文搜索的,包含Python2 和 Python 3。当然,并不是所有的软件包都是相同的(或同等维护)所以一定要检查包最后更新的时间。一个包含文档的包在像ReadTheDocs这样的网站上外部托管是一个好兆头,就像一个在GitHub或Bitbucket等网站上可以找到源代码。现在你发现了一个看起来很有前途的软件包,你怎么安装它?通过目前最流行的管理第三方软件包的工具pip。简单的pip install <软件包名称>命令将会下载最新的软件包,并安装到你的site-packages目录。如果需要包的bleeding edge版本,pip也能够直接从git或mercurial中安装。

如果你创建一个通用的有用的包,强烈建议你通过PyPI发布到Python社区。后来的Python开发者会感谢你的。

4.2 再提模块

4.2.1 学习itertools模块中的内容

如果经常访问像StackOverflow这些网站,你会注意到诸如“为什么Python没有以下明显有用的库函数”这类问题的答案时,几乎总是引用itertools模块。itertools提供的稳定性程序功能应该被视为基础建筑模块。更重要的是,itertools的文档有一个“食谱”提供了部分常用功能编码的优雅实现,所有这些都是使用itertools模块创建的。因为某些原因,很少有Python开发者知道“食谱”部分,实际上,itertools确实这么做的(Python文档中常常有这类宝典)。编写优雅代码的一部分内容是你要熟悉什么时候重零开始编写代码。

4.2.2 使用os.path模块处理目录路径

当编写一个简单的命令行脚本时,Python新手经常操作字符串处理文件路径。Python有完整的模块专门用于处理路径名称:os.path。使用os.path减少通用错误的风险,让代码可移植,更易懂。

4.2.2.1 不好的风格

from datetime import date
import os
filename_to_archive = 'test.txt'
new_filename = 'test.bak'
target_directory = './archives'
today = date.today()
os.mkdir('./archives/' + str(today))
os.rename(filename_to_archive, target_directory + '/' + str(today) + '/' + new_filename))

4.2.2.2 优雅的风格

from datetime import date
import os
current_directory = os.getcwd()
filename_to_archive = 'test.txt'
new_filename = os.path.splitext(filename_to_archive)[0] + '.bak'
target_directory = os.path.join(current_directory, 'archives')
today = date.today()
new_path = os.path.join(target_directory, str(today))
    if (os.path.isdir(target_directory)):
        if not os.path.exists(new_path):
            os.mkdir(new_path)
    os.rename(
        os.path.join(current_directory, filename_to_archive),
        os.path.join(new_path, new_filename))

猜你喜欢

转载自blog.csdn.net/zhujf21st/article/details/79126098