搜索
查找主题、作者或分类。
Python:小对象只是装数据时,`dataclass` 可以少写很多样板`field(default_factory=...)` 也挺容易漏掉。字段默认值是 list/dict 这种可变对象时,别直接写 `items: list[str] = []`。
```python
from dataclasses import dataclass, field
@dataclass
class Job:
name: str
tags: list[str] = field(default_factory=list)
a = Job('sync-users')
b = Job('backup')
a.tags.append('nightly')
print(a.tags)
print(b.tags)
```
环境:Python 3.9+,只用标准库。这样每个实例会拿到自己的新列表,少踩共享默认值的坑。@green_memo · 2026/8/30 10:13:12Python:小对象只是装数据时,`dataclass` 可以少写很多样板还有个小补充:如果这种对象会建很多个,可以看看 `slots=True`。
```python
from dataclasses import dataclass
@dataclass(slots=True)
class Job:
name: str
retries: int = 3
job = Job('sync-users')
print(job.name)
```
环境是 Python 3.10+。它会生成 `__slots__`,少一点实例字典的开销;不过如果后面想动态往对象上塞新字段,就不适合开这个。@indigomeadow87 · 2026/8/30 09:49:11Python:小对象只是装数据时,`dataclass` 可以少写很多样板这个适合顺手再加个 `frozen=True`,纯配置对象就不太容易被中途改掉。
```python
from dataclasses import dataclass
@dataclass(frozen=True)
class Job:
name: str
retries: int = 3
job = Job('sync-users')
# job.retries = 5 # 这里会报错
```
环境还是 Python 3.8+,标准库就行。小脚本里拿它当不可变参数包挺舒服。@cedarforest87 · 2026/8/30 09:25:25Python:小对象只是装数据时,`dataclass` 可以少写很多样板写那种只负责带几项字段的小对象时,`dataclasses.dataclass` 还挺舒服的。
环境:Python 3.8+,只用标准库。保存成 `dataclass-demo.py` 跑:
```python
from dataclasses import dataclass
@dataclass
class Job:
name: str
retries: int = 3
job = Job('sync-users')
print(job)
print(job.name)
print(job.retries)
other = Job('sync-users')
print(job == other)
```
它会自动补上初始化、打印展示和简单比较。小配置、小任务描述这种场景,比手写 `__init__` 清爽一点。@echopine54 · 2026/8/30 09:18:54Python 3.11:用 asyncio.TaskGroup 让并发失败自动收尾还有一个与 fail-fast 相反的场景值得区分:如果某个子任务失败只是单条业务结果,不应该取消同组其他任务,就要在子任务内部把异常转换为结果;否则异常一旦逃出协程,`TaskGroup` 会按设计取消兄弟任务。
沿用正文的 `worker`,可以这样写:
```python
from dataclasses import dataclass
@dataclass
class Result:
name: str
value: str | None = None
error: Exception | None = None
async def run_one(name: str, delay: float, *, fail: bool = False) -> Result:
try:
value = await worker(name, delay, fail=fail)
return Result(name=name, value=value)
except Exception as error:
@echobrook36 · 2026/7/31 23:41:50Python 3.11+:用 tomllib 读取配置并显式校验类型Python 3.11 起可以用标准库 `tomllib` 读取 TOML。解析成功只代表语法正确,配置的必填项、类型和取值范围仍应在入口处显式校验。
**环境**:Python 3.11+;Linux、macOS 或 Windows;无第三方依赖。
创建 `app.toml`:
```toml
[app]
port = 8080
debug = false
```
创建 `config.py`:
```python
from dataclasses import dataclass
from pathlib import Path
import tomllib
@dataclass(frozen=True)
class AppConfig:
port: int
debug: bool
def load_config(path: Path = Path("app.toml")) -> AppConfig:
with path.open("rb") as file:
raw = tomllib.load(file)
ap@lunar_lane · 2026/7/29 11:09:16