Appearance
第18章:Python 代码规范与安全防护
18.1 代码规范
良好的代码规范可以提高代码的可读性、可维护性和可扩展性,是每个Python开发者必须遵守的基本准则。
命名规范
变量名:使用小写字母,单词之间用下划线分隔(snake_case)
- 示例:
user_name、age、student_id
- 示例:
函数名:使用小写字母,单词之间用下划线分隔(snake_case)
- 示例:
get_user_info()、calculate_average()
- 示例:
类名:使用大驼峰命名法(CamelCase),每个单词首字母大写
- 示例:
Person、Student、UserManager
- 示例:
常量:使用全大写字母,单词之间用下划线分隔
- 示例:
MAX_AGE、PI、DEFAULT_TIMEOUT
- 示例:
模块名:使用小写字母,单词之间用下划线分隔
- 示例:
user_manager.py、data_processing.py
- 示例:
包名:使用小写字母,单词之间用下划线分隔
- 示例:
my_package、utils
- 示例:
缩进规范
- 使用4个空格进行缩进,不要使用Tab键
- 保持缩进一致,避免混合使用空格和Tab
- 函数体、循环体、条件语句等都需要缩进
注释规范
单行注释:使用
#开头,注释内容与#之间空一格- 示例:
# 这是一个单行注释
- 示例:
多行注释:使用三引号
"""或'''包裹- 示例:python
""" 这是一个多行注释 用于解释函数的功能、参数和返回值 """
- 示例:
函数注释:使用文档字符串(docstring),说明函数的功能、参数、返回值
- 示例:python
def add(a, b): """ 计算两个数的和 Args: a: 第一个数 b: 第二个数 Returns: 两个数的和 """ return a + b
- 示例:
注释原则:
- 注释应该简洁明了,避免冗余
- 注释应该解释"为什么",而不是"是什么"
- 关键代码、复杂逻辑必须添加注释
- 代码修改时,相应的注释也应该更新
代码格式
- 一行只写一条语句,避免一行多句
- 每行代码长度控制在79个字符以内,超过需要换行
- 使用空格分隔运算符和操作数,提高可读性
- 示例:
a = b + c而不是a=b+c
- 示例:
- 函数和类之间空两行,函数内部不同逻辑块之间空一行
18.2 安全防护
输入验证
验证用户输入:对所有用户输入的数据进行验证,确保数据符合预期格式
- 示例:验证年龄是否为整数,邮箱是否符合格式
防止注入攻击:使用参数化查询,避免直接拼接SQL语句
- 示例:python
# 不安全的做法 query = f"SELECT * FROM users WHERE username = '{user_input}'" # 安全的做法 query = "SELECT * FROM users WHERE username = %s" cursor.execute(query, (user_input,))
- 示例:
防止XSS攻击:对用户输入的内容进行转义,避免恶意脚本
- 示例:使用HTML转义函数处理用户输入
文件安全
验证文件路径:避免用户输入直接作为文件路径,防止路径遍历攻击
- 示例:python
# 不安全的做法 file_path = f"/data/{user_input}" # 安全的做法 import os safe_path = os.path.join("/data", os.path.basename(user_input))
- 示例:
限制文件操作权限:只授予必要的文件操作权限
检查文件类型:验证文件类型,避免处理恶意文件
使用上下文管理器:使用
with语句处理文件,确保文件正确关闭
第三方模块安全
- 从官方渠道安装:只从PyPI等官方渠道安装第三方模块
- 验证模块版本:使用指定版本的模块,避免使用有安全漏洞的版本
- 定期更新:定期更新第三方模块,修复安全漏洞
- 检查依赖:使用工具检查依赖模块的安全漏洞
- 示例:使用
safety工具检查依赖安全
- 示例:使用
18.3 代码调试技巧
print()调试
- 在关键位置打印变量值,排查代码逻辑错误
- 使用
print()函数输出变量的类型和值- 示例:
print(f"变量x的值:{x},类型:{type(x)}")
- 示例:
- 打印函数的返回值,验证函数执行结果
PyCharm调试
- 设置断点:在代码的关键位置设置断点
- 单步执行:使用单步执行功能,逐行查看代码执行过程
- 查看变量:在调试过程中查看变量的变化
- 条件断点:设置条件断点,当满足特定条件时暂停执行
异常信息排查
- 阅读异常信息:仔细阅读异常提示信息,了解错误类型和位置
- 定位错误:根据异常栈信息,定位错误发生的位置
- 分析原因:分析错误原因,确定解决方案
- 测试修复:修复错误后,进行测试验证
调试示例
python
# 调试示例:计算平均值
def calculate_average(numbers):
"""计算列表的平均值"""
try:
# 打印输入参数
print(f"输入列表:{numbers}")
# 计算总和
total = sum(numbers)
print(f"总和:{total}")
# 计算平均值
average = total / len(numbers)
print(f"平均值:{average}")
return average
except Exception as e:
print(f"错误:{e}")
import traceback
traceback.print_exc()
return None
# 测试
numbers = [1, 2, 3, 4, 5]
average = calculate_average(numbers)
print(f"最终结果:{average}")
# 测试错误情况
empty_list = []
average_empty = calculate_average(empty_list)
print(f"空列表结果:{average_empty}")调试工具
- pdb:Python内置的调试器
- 用法:在代码中添加
import pdb; pdb.set_trace()
- 用法:在代码中添加
- ipdb:增强版的pdb,提供更好的交互体验
- PyCharm调试器:图形化调试工具,功能强大
- 日志模块:使用
logging模块记录调试信息
通过遵守代码规范和安全防护措施,可以编写更加安全、可靠、可维护的Python代码。同时,掌握调试技巧可以帮助你更快地定位和解决问题,提高开发效率。
