十年Python老鸟总结的5条Python开发最佳实践

简介: 作为一个做了十几年Python开发的老鸟,为大家总结出5条Python开发最佳实践。

Python是一门动态语言。动态性为Python带来了巨大的灵活性和表达力。但是任何事物都有两面性,动态性给Python带来强大能力的同时也带来了一些混乱,因此我们在开发过程中最好遵循某种最佳实践,以确保少犯错、不犯错。作为一个做了十几年Python开发的老鸟,为大家总结出5条Python开发最佳实践。

Python-Best-Practices_Watermarked.png

关于Python中常犯的错误、常掉的坑,我整理了另外一系列文章,大家可以移步到
Python避坑指南Python避坑指南(续) 阅读。

不要用索引遍历序列

不要这样做

for i in range(len(tab)):
    print(tab[i])

建议这样做

for elem in tab:
    print(elem)

如果同时需要索引和元素,请用enumerate

for i, elem in enumerate(tab):
    print((i, elem))

谨慎使用 "=="判断真假

if (var == True):
    # 当var为True或1(包括1.0, 1L)时上面条件判断为True

if (var != True):
    # 当var不为True或1时上面条件判断为True

if (var == False):
    # 当var为False或0 (包括0.0, 0L, 0j)时上面条件判断为True

if (var == None):
    # 当var为None时上面条件判断为True

if var:
    # 当var为非空字符串/列表/字典/元组以及True和非0值时上面判断条件为True

if not var:
    # 当var为 "", {}, [], (), 0, None, False时上面判断条件为True

if var is True:
    # 当var为布尔值True时上面判断条件为True

if var is False:
    # 当var为布尔值False时上面判断条件为True

if var is None:
    # 当var为None时上面条件判断为True

善用错误处理

Python圈里有句至理名言:“请求宽恕易,请求许可难”("It's easier to ask for forgiveness than permission")

不要这样做

if os.path.isfile(file_path):
    file = open(file_path)
else:
    # do something

建议这样做

try:
    file = open(file_path)
except OSError as e:
    # do something

如果你用的Python版本为2.6+,那么用with替代try…except…finally可以进一步提升代码的易用性和简洁性。

with open(file_path) as file:

with 语句实现原理建立在上下文管理器之上。上下文管理器是一个实现 __enter___exit\_ 方法的类。使用 with 语句确保在嵌套块的末尾调用 __exit__ 方法。这个概念类似于 try...finally 块的使用,但用with语句不用关心如何做保护,只需要关心可能面临的异常即可。

善用"鸭子类型"

Python是一门动态语言,因此类型检查会失去Python的这种灵活性优势。相反,我们应该用鸭子类型类检测行为。如果你希望得到一个字符串,那么就用str()将对象转换为字符串;如果你希望得到一个列表,那么就用list()将可迭代对象转换成列表。

不要这样做

def foo(name):
    if isinstance(name, str):
    print(name.lower())

def bar(listing):
    if isinstance(listing, list):
    listing.extend((1, 2, 3))
    return ", ".join(listing)

推荐这样做

def foo(name) :
    print(str(name).lower())

def bar(listing) :
    l = list(listing)
    l.extend((1, 2, 3))
    return ", ".join(l)

用上面的代码,函数foo()支持传入一切对象;函数bar()支持传入字符串、元组、集合、列表...等一切可迭代类型。更加符合DRY(Don't Repeat Yourself)原则。

不要在init之外初始化成员变量

很多其他语言(尤其是Java和PHP)转Python的开发者会习惯性地将成员变量写在类名下方,并赋予默认值。这样做在Python中虽然不会报错,但程序行为可能给你预期的不一样。这样定义的变量是类属性(静态变量)。

这意味着2大危害:

  1. 如果类属性发生改变,那么初始值也会变;
  2. 如果设置的初始值是一个可变对象,那么这个变量在实例间是共享的。

不要这样做(除非定义静态变量)

class Car(object):
    color = "red"
    wheels = [Wheel(), Wheel(), Wheel(), Wheel()]

推荐这样做

class Car(object):
    def __init__(self):
        self.color = "red"
        self.wheels = [Wheel(), Wheel(), Wheel(), Wheel()]

总结

以上5条,只要大家在开发中能严格遵守,写出的代码无论是健壮性还是可维护性都会更行一层楼。

目录
相关文章
|
17天前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
61 15
|
21天前
|
数据采集 Web App开发 监控
高效爬取B站评论:Python爬虫的最佳实践
高效爬取B站评论:Python爬虫的最佳实践
|
28天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
139 45
|
24天前
|
JSON 安全 API
如何使用Python开发API接口?
在现代软件开发中,API(应用程序编程接口)用于不同软件组件之间的通信和数据交换,实现系统互操作性。Python因其简单易用和强大功能,成为开发API的热门选择。本文详细介绍了Python开发API的基础知识、优势、实现方式(如Flask和Django框架)、实战示例及注意事项,帮助读者掌握高效、安全的API开发技巧。
48 3
如何使用Python开发API接口?
|
16天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
30 1
|
22天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
29天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
86 7
|
1月前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
43 8
|
28天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
性能优化与代码审查:提升Python开发效率
35 1
|
29天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
43 2