Python 常见规范与高阶模式
以下文档汇总了 Python 中常用的命名规范、函数签名约定、装饰器、类型注解、魔法方法,以及在大型项目中常见的架构和操作模式。
1. 命名规范(Naming Conventions)
| 前缀/形式 | 含义 | 示例 |
|---|---|---|
age |
普通变量/属性 | age = 30 |
_age |
单下划线:弱“私有”标记,不建议外部使用 | self._age = 30 |
__age |
双下划线:名称改写(name mangling) | self.__age = 30 |
__age__ |
双前后下划线:系统保留(魔法方法/特殊属性) | __init__, __str__ |
ALL_CAPS |
常量 | MAX_RETRIES = 5 |
snake_case |
下划线式,函数/变量推荐 | compute_value() |
MixedCase |
类名,首字母大写驼峰式 | class MyClass: |
mixedCase |
驼峰式,不推荐,少见 | someVar |
module_name |
文件或包名,均使用小写+下划线 | utils/helpers.py |
额外补充:
__slots__:定义在类中,限制实例属性集合。- 模块级 dunder:
__name__,__all__,__version__。
2. 函数签名与参数约定
def func(pos1, pos2, /, arg1, arg2=42, *args, kw_only1, kw_only2=None, **kwargs) -> ReturnType:
...
/前参数只能通过位置传递(Python 3.8+)。- 默认参数带默认值。
*args:可变位置参数收集为元组。kw_only:在*后的参数必须通过关键字传递。**kwargs:可变关键字参数收集为字典。-> ReturnType:返回值类型注解。
额外补充:
- 参数前置星号:
def f(*, a, b):强制a、b为关键字。 - 参数后置斜杠:
def f(a, b, /, c):强制a、b为位置。 - 默认值宜使用不可变类型,避免共享可变默认值陷阱。
- 使用
typing模块:List[int],Dict[str, Any],Optional[T]。
3. 装饰器(Decorators)
@decorator:在函数/类定义时应用,等价于:func = decorator(func)
内置常用装饰器:
@staticmethod@classmethod@property@functools.lru_cache
自定义装饰器:接收被装饰对象并返回新对象。可用于权限校验、缓存、日志等场景。
额外补充:
- 带参装饰器:
def deco(arg): ...返回实际装饰器。 functools.wraps:保持原函数元数据。
4. 类型注解(Type Hints)
from typing import List, Dict, Optional, Union, Any
def greet(name: str, times: int = 1) -> None:
...
def parse(data: bytes) -> Union[Dict[str, Any], None]:
...
- Python 3.9+ 可直接写
list[int],dict[str, float]。 # type: ignore用于忽略特定行的类型检查。TypeVar,Generic用于定义泛型类。
5. 魔法方法与协议(Special Methods & Protocols)
常见魔法方法:
- 构造与表示:
__init__,__new__,__repr__,__str__ - 容器行为:
__len__,__getitem__,__setitem__,__contains__ - 可调用与迭代:
__call__,__iter__,__next__ - 运算符重载:
__add__,__eq__,__lt__等 - 上下文管理:
__enter__,__exit__
- 构造与表示:
协议(Protocol):结构化子类型,只要实现签名即可视为该类型。
额外补充:
- 自定义上下文管理器:支持
with语句。 - 自定义迭代器:实现
__iter__与__next__。
6. 代码组织与项目结构
my_project/
├── src/ # 源码目录
│ └── my_package/
│ ├── __init__.py
│ ├── core.py
│ └── utils.py
├── tests/ # 单元测试
│ └── test_core.py
├── docs/ # 文档(Sphinx / MkDocs)
├── configs/ # 配置文件(yaml/json)
├── requirements.txt
├── pyproject.toml # Poetry / PEP 517
└── .github/workflows/ # CI 配置
额外补充:
- 分层:
api/,service/,repository/,models/。 - 包含
__all__控制from module import *。
7. 大型项目常用操作模式
- 日志记录(Logging):
logging.getLogger(__name__)+ 配置Handler。 - 配置管理:
pydantic,dataclasses, 环境变量加载。 - 测试:
pytest+ fixtures +mock。 - 静态检查:
mypy,flake8,isort,black。 - 依赖管理:
poetry,pipenv。 - CI/CD:GitHub Actions / GitLab CI。
- 文档生成:
Sphinx+autodoc/MkDocs。 - 数据库/ORM:
SQLAlchemy,Django ORM,asyncpg。 - 异步编程:
asyncio,aiohttp,FastAPI。 - 缓存:
redis,memcached。 - 任务队列:
Celery,RQ。 - 监控:
Prometheus,Sentry。 - 打包分发:
setuptools,twine。
如有更多场景(如元类、AST 操作、性能调优、C 扩展等)可继续补充。
Python 常见规范与高阶模式的更多相关文章
- 【python】python函数式编程、高阶函数
1.map() : python内置的高阶函数,接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并 返回. def f(x): r ...
- python 函数式编程:高阶函数,map/reduce
python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...
- python入门16 递归函数 高阶函数
递归函数:函数内部调用自身.(要注意跳出条件,否则会死循环) 高阶函数:函数的参数包含函数 递归函数 #coding:utf-8 #/usr/bin/python """ ...
- python内置常用高阶函数(列出了5个常用的)
原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...
- python高级特性和高阶函数
python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...
- python(内置高阶函数)
1.高阶函数介绍: 一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),如果满足其一,则为高阶函数. 常见的高阶函数:map().sorted( ...
- Python之路 day3 高阶函数
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 变量可以指向函数,函数的参数能接收变量, 那么 ...
- Python 编程基础之高阶函数篇(一)
高阶函数:能接受函数作为参数的函数. 如: f=abs def add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...
- python进阶学习之高阶函数
高阶函数就是把函数当做参数传递的一种函数, 例如: 执行结果: 1.map()函数 map()接收一个函数 f 和一个list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 l ...
- [ python ] 匿名函数和高阶函数
匿名函数 描述: 关键字 lambda 定义的函数 语法: 函数名 = lambda 参数:返回值 返回值: 函数返回结果值 实例: 一个参数的匿名函数: func = lambda ...
随机推荐
- SciTech-BigDataAIML-LLM-Transformer Series-$\large Supervised\ Statistical\ Model$监督学习的统计模型+$\large Transformer+Self Attention$的核心原理及实现
SciTech-BigDataAIML-LLM-Transformer Series> \(\large Supervised\ Statistical\ Model\): \(\large T ...
- JobSystem的使用场合
1. 大规模行为更新,比如什么呢,上万个AI移动 2.大数量级的for循环 上面代码是for循环1000万次开方运算所需要的时间 对大数量级的for循环优化非常明显!
- git命令行最佳学习方式
https://learngitbranching.js.org/
- 为什么用Spring的一个原因(转)
链接:https://www.zhihu.com/question/27053548/answer/85060703 当你发现代码经常重复,你会考虑将其写成函数,封装工具:当你发现多人合作时,代码耦合 ...
- 7、rt-thread学习-env与menuconfig的补充
1.介绍下实际的应用 1)首先对我们自己的env做下配置,打开rt-thread源码,在任意一个bsp下,打开env,输入menuconfig -s,此时会弹出env配置菜单,一个是退出menucon ...
- echarts 案例大全(传送门)
传送门一: http://ppchart.com/#/ 传送门二: http://analysis.datains.cn/finance-admin/index.html#/chartLib/all ...
- Prometheus 监控 Kubernetes Cluster 最新极简教程
Kubernetes 是在生产中运行容器化工作负载的最流行的编排器.它为您提供了一套完整的工具,用于部署.扩展和管理容器. 不过,仅靠 Kubernetes 不足以运维应用程序.您还需要了解集群利用率 ...
- 一步一步学习使用LiveBindings(15)TListView进阶使用(3),创建自定义的列表项打造天气预报程序
本节内容是<一步一步学习使用LiveBindings(14)>中天气预报小程序的进一步优化.虽然编写代码创建TListView的列表项可以提供较大的灵活民生,但是造成代码复杂性增加,而且可 ...
- [题解]ABC404F Lost and Pound
[ABC404F] Lost and Pound ~ AtCoder 根据题意,玩家所知道的信息,仅有"当前的轮数"和"正确按钮已经被按下多少次",所以可以设计 ...
- Spring AOP 与 Solon AOP 有什么区别?
Spring 和 Solon 作为容器型框架.都具有 IOC 和 AOP 的能力.其中: Spring AOP 使用表达式确定"切入点",可以是某个注解(有侵入),可以是包名或类名 ...