好的变量与注释并非为计算机而写,而是为每个阅读代码的人而写。变量与注释是作者表达思想的基础,是读者理解代码的第一道门,它们对代码质量的贡献毋庸置疑。
1.1 基础知识
1.1.1 变量常用方法
author = 'piglei'
print('Hello, {}!'.format(author))
author, reader = 'piglei', 'raymond'
author, reader = reader, author
变量解包
是一种特殊赋值操作,把一个可迭代对象的所有成员,一次性赋值给多个变量。usernames = ['piglei', 'raymond'] author, reader = usernames attrs = [1, ['piglei', 100]] user_id, (username, score) = attrs
动态解包
用星号表达式(*variables)作为变量名,可以贪婪地捕获多个值对象,并将捕获的内容作为列表赋值给该表达式。data = ['piglei', 'apple', 'orange', 'banana', 100] username, *fruits, score = data # 等价于如下切片语句 username, *fruits, score = data[0], data[1:-1], data[-1] # 解包操作可用于循环语句 for username, score in [('piglei', 100), ('raymand', 90)]: print(username)
单下划线变量名_
通常作为无意义的占位符出现在赋值语句中
约定俗成:# 忽略展开时的第二个变量 author, _ = usernames # 忽略第一个和最后一个变量之间的所有变量 username, *_, score = data
Python交互式命令行里,_变量特殊含义为:默认保存输入的上个表达式的返回值。
1.1.2 给变量注明类型
函数文档:Sphinx格式文档
def remove_invalid(items): """ 剔除 items 里面无效的元素 :param items: 待剔除对象 :type items: 包含整数的列表,[int, ...] """
类型注解
from typing import list def remove_invalid(items: List[int]): """ 剔除 items 里面无效的元素 """
List 表示参数为列表类型,[int] 表示里面的成员是整型。
类型注解 只是一种有关类型的注释,不提供任何校验功能。需要使用 mypy 等静态类型检查工具检查。
jira库大量使用了这种注解方式,参考client.py如下函数:def project(self, id: str, expand: Optional[str] = None) -> Project: """Get a project Resource from the server. Args: id (str): ID or key of the project to get expand (Optional[str]): extra information to fetch for the project such as projectKeys and description. Returns: Project """ return self._find_for_resource(Project, id, expand=expand)
1.1.3 变量命名原则
计算机科学领域只有两件难事:缓存失效和命名。--- Phil Karlton
- 遵循 PEP 8 原则
- 描述性要强
- 尽量短
尽量不要超过4个单词 - 匹配类型
最好别拿一个名词的复数形式来做为 int 类型的变量名,比如 apples、trips 等。因为这类名字容易与那些装着 Apple 和 Trip 的普通容器对象 (List[Apple]、List[Trip]) 混淆。 - 超短命名
1.1.4 注释基础知识
- 代码内注释
- 接口注释
Sphinx 文档风格
Google 风格
编写注释常见的3种错误:
- 用注释屏蔽代码
- 用注释复述代码
解释性注释
指引性注释,降低代码的认知成本 弄错接口注释的受众
1.2 案例故事
1.3 编程建议
1.3.1 保持变量的一致性
1.3.2 变量定义尽量靠近使用
1.3.3 定义临时变量提升可读性
1.3.4 同一作用域内不要有太多变量
1.3.5 能不定义变量就别定义
未来没有来,就不需要为未来筹备。
1.3.6 不要使用locals()
该内置函数返回当前作用域中的所有局部变量。
Explicit is better than implicit.
Python之禅:显示优于隐式。1.3.7 空行也是一种注释
1.3.8 先写注释,后写代码
在写出一句有说服力的接口注释前,别写任何函数代码。
1.4 总结
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。