Python代码规范指南:提升PyCharm中的可读性与健壮性
一个函数只做一件事,不超过150行,函数之间空两行,不要有报黄波浪线,命名规范,注意命名规范,不要想当然认为代码出什么问题要以实测为核心找到真正的问题在哪,不然把代码修改了,还自以为修改正确了,实际的问题依然没有解决,你以为出问题的地方一定会出问题
一、命名规范与代码结构
1.1 有意义的命名规则
- 变量/函数:小写字母 + 下划线(snake_case)
- 类名:大驼峰(UpperCamelCase)
- 常量:全大写 + 下划线(UPPER_CASE)
- 布尔值:以is/has开头(is_valid, has_permission)
反例:
python
def p(): ... # 无意义命名
data = [] # 模糊的集合名称
正例:
python
def calculate_order_total(order_items: list) -> float: ...
MAX_RETRY_COUNT = 3
is_payment_completed = False
1.2 函数设计原则
python
# 违反单一职责
def process_order(order):
validate_items(order.items) # 验证
calculate_total(order) # 计算
save_to_db(order) # 持久化
# 合规示例
def validate_order_items(items: list) -> bool:
"""验证订单项有效性"""
# 实现细节...
return is_valid
def calculate_order_total(items: list) -> float:
"""计算订单总金额"""
# 实现细节...
return total
def persist_order(order: Order) -> None:
"""持久化订单数据"""
# 实现细节...
二、代码格式最佳实践
2.1 PyCharm自动格式化配置
- 启用
File > Settings > Editor > Code Style > Python
- 设置缩进为4空格
- 配置行宽限制120字符
- 安装Black插件(
pip install black
)
2.2 视觉友好布局
python
# 正确间距示例
def load_user_profile(user_id: int) -> dict:
"""获取用户完整档案"""
user_data = fetch_from_database(user_id)
cleaned_data = sanitize_user_data(user_data)
return format_for_display(cleaned_data)
def sanitize_user_data(raw_data: dict) -> dict:
"""清理敏感用户信息"""
# 数据清理逻辑...
return filtered_data
三、错误处理与防御性编程
3.1 异常处理模板
python
def connect_database(conn_str: str) -> Connection:
"""建立数据库连接"""
try:
conn = psycopg2.connect(conn_str)
conn.ping() # 验证连接有效性
return conn
except psycopg2.OperationalError as e:
logging.error(f"数据库连接失败: {str(e)}")
raise DatabaseConnectionError from e
except TimeoutError:
logging.warning("连接超时,尝试重连...")
return _retry_connection(conn_str)
3.2 单元测试样例(pytest)
python
# test_validation.py
def test_username_validation():
assert validate_username("user_2023") is True
assert validate_username("a") is False # 长度不足
assert validate_username("admin#") is False # 非法字符
def test_password_strength():
assert check_password_strength("Aa1!aaaa") == 4 # 最高强度
assert check_password_strength("password") == 1 # 弱密码
四、常见陷阱与优化建议
4.1 魔法数字消除
python
# 改进前
if retry_count > 3: ...
# 改进后
MAX_RETRIES = 3
if retry_count > MAX_RETRIES: ...
4.2 防御性参数检查
python
def calculate_discount(price: float, discount_rate: float) -> float:
"""计算商品折扣价格"""
if not isinstance(price, (int, float)):
raise TypeError("价格必须为数值类型")
if not 0 <= discount_rate <= 1:
raise ValueError("折扣率应在0-1之间")
return max(0, price * (1 - discount_rate))
五、PyCharm高效调试技巧
- 智能断点:右键设置条件断点
- Evaluate Expression:运行时验证表达式
- Code Validation:实时检查PEP8违规
- 类型提示检查 :启用
Settings > Editor > Inspections > Python > Type checker
六、实战案例:用户注册模块
python
class UserRegistration:
MAX_USERNAME_LENGTH = 30
MIN_PASSWORD_LENGTH = 8
def __init__(self, db_conn: Connection):
self.connection = db_conn
def register_user(self, username: str, password: str, email: str) -> dict:
"""用户注册主流程"""
validate_credentials(username, password)
hashed_password = self._hash_password(password)
user_id = self._persist_user(username, hashed_password, email)
return self._generate_response(user_id)
@classmethod
def validate_credentials(cls, username: str, password: str) -> None:
"""验证用户凭证格式"""
if len(username) > cls.MAX_USERNAME_LENGTH:
raise ValueError("用户名超过最大长度限制")
if len(password) < cls.MIN_PASSWORD_LENGTH:
raise ValueError("密码长度不足最低要求")
if not re.match(r"^[\w.@+-]+$", username):
raise ValueError("用户名包含非法字符")
def _persist_user(self, username: str, password: str, email: str) -> int:
"""持久化用户记录"""
try:
return self.connection.execute(
"INSERT INTO users (...) VALUES (...) RETURNING id",
(username, password, email)
)
except DuplicateKeyError:
raise RegistrationError("用户名已被注册") from None
附录:完整规范检查清单
- 所有函数长度≤150行
- 函数间保留两个空行
- 消除所有IDE警告提示
- 类型提示覆盖率≥90%
- 关键路径单元测试覆盖率≥80%
- 已通过mypy静态类型检查
最佳实践提示 :定期使用pylint --generate-rcfile > .pylintrc
生成规范配置,与团队共享统一的代码质量规则。