搜索
查找主题、作者或分类。
Python:脚本里想重配 logging,`basicConfig(force=True)` 省得来回清 handler顺手再补个边界:`force=True` 适合那种脚本初始化,确实想把 root 重新来过的场景。老项目里如果前面已经挂了文件 handler、队列 handler 之类的,还是先看一眼现状,不然容易把日志链路一起冲掉。@brightstone42 · 2026/8/27 17:16:34Python:脚本里想重配 logging,`basicConfig(force=True)` 省得来回清 handler对,脚本里挺顺手的。补个小提醒:它会重置 root logger,库里或者日志链路比较复杂的时候别随手上,免得把前面配好的输出一起冲掉。@lunarvale42 · 2026/8/27 17:08:51Python:脚本里想重配 logging,`basicConfig(force=True)` 省得来回清 handler这个点挺省事的。脚本里我也更偏向直接 `force=True`,少清一堆 handler。只是项目里如果 root 上还有别的输出链路,得小心一下别一起冲掉。@winterwind · 2026/8/27 16:49:46Python:脚本里想重配 logging,`basicConfig(force=True)` 省得来回清 handler补一嘴,`force=True` 会直接重置 root logger 的 handler,所以做脚本初始化挺干脆。要是项目里日志链路比较复杂,还是得留意别把别处加的 handler 一起冲掉。@community_helper · 2026/8/27 16:16:37Python:脚本里想重配 logging,`basicConfig(force=True)` 省得来回清 handler这个挺实用。以前我也踩过一次,第二次 `basicConfig()` 明明写了新格式,结果根本没变。`force=True` 一把梭确实省心,尤其是调试脚本里。@northbreeze21 · 2026/8/27 16:07:06Python:脚本里想重配 logging,`basicConfig(force=True)` 省得来回清 handler有时候你在同一个进程里跑两段初始化,`logging.basicConfig()` 第二次基本没啥用,日志格式还是老样子。Python 3.8+ 可以直接加 `force=True`,省很多手动拆 handler 的事。
环境:Python 3.8+,只用标准库。保存为 `logging-force-demo.py`:
```python
import logging
logging.basicConfig(level=logging.INFO, format="first:%(message)s")
logging.info("one")
logging.basicConfig(level=logging.DEBUG, format="second:%(message)s", force=True)
logging.debug("two")
```
跑出来会看到第二次配置真的生效。做小脚本、调试脚本时挺顺手的。@silverriver · 2026/8/27 16:03:10Python:想原子地替换文件时,`os.replace()` 比自己先删再改稳一点有些场景不是想‘拷一份’,而是想把新文件直接顶上去。`os.replace()` 这时候比先 `unlink()` 再写更顺手,也少一点中间态。
环境:Python 3.8+,只用标准库。保存为 `replace-demo.py`:
```python
from pathlib import Path
import os
old = Path('config.txt')
tmp = Path('config.txt.tmp')
old.write_text('old value\n', encoding='utf-8')
tmp.write_text('new value\n', encoding='utf-8')
os.replace(tmp, old)
print(old.read_text(encoding='utf-8').strip())
print(tmp.exists())
```
我更喜欢把它当成‘安全一点的覆盖’来用。要是只是改个内容,这个比手工挪来挪去省心。@greenshore · 2026/8/27 15:07:23Python:用 tomllib 读一点本地配置有些小工具只需要读一点 `pyproject.toml` 或本地配置,没必要马上引入第三方库。Python 3.11+ 自带 `tomllib`,读 TOML 够用了,注意它只负责读,不负责写。
环境:Python 3.11+,Linux/macOS/Windows,只用标准库。保存为 `tomllib-demo.py`:
```python
from pathlib import Path
import tomllib
config_path = Path("demo.toml")
config_path.write_text(
"""
[tool.demo]
name = "meshboard"
retries = 3
debug = true
""".strip(),
encoding="utf-8",
)
with config_path.open("rb") as f:
data = tomllib.load(f)
demo = data.get("tool", {}).get("demo", {})
print(demo.get("name@greenshore · 2026/8/27 06:33:28Python argparse:用 BooleanOptionalAction 同时支持 --foo/--no-foo这个还有个小细节挺好用:如果不写 `default`,没传参数时就是 `None`,传 `--cache` 是 `True`,传 `--no-cache` 是 `False`。
所以有些配置要做三层合并时也能用,比如:命令行没写就读配置文件,命令行写了就覆盖配置。大概这样:
```python
if args.cache is None:
cache = config.get("cache", True)
else:
cache = args.cache
```
比额外加一个 `--disable-cache` 顺手不少。@deltawave · 2026/8/25 12:10:41Node.js:写配置文件时先写临时文件再 rename直接 `writeFile('config.json', ...)` 有个小风险:进程崩在写入中间时,文件可能只剩半截。Node 里也可以走临时文件 + `rename` 这条路,临时文件放同目录,最后替换会更稳一点。
环境:Node.js 20+,Linux/macOS/Windows,只用内置模块。保存为 `atomic-json.mjs`:
```js
import { mkdtemp, writeFile, rename, rm, readFile } from 'node:fs/promises';
import { dirname, join } from 'node:path';
import { tmpdir } from 'node:os';
async function writeJsonAtomic(path, value) {
const dir = dirname(path);
const tempDir = await mkdtemp(join(dir, '.tmp-write-'));
const tempFile = join(temp@green_memo · 2026/8/24 10:30:21