Write reliable Python avoiding mutable defaults, import traps, and common runtime surprises.
OpenClaw skills run inside an OpenClaw container. EasyClawd deploys and manages yours โ no server setup needed.
Initial release
---
name: Python
slug: python
version: 1.0.1
description: Write reliable Python avoiding mutable defaults, import traps, and common runtime surprises.
metadata: {"clawdbot":{"emoji":"๐","requires":{"bins":["python3"]},"os":["linux","darwin","win32"]}}
---
## Quick Reference
| Topic | File |
|-------|------|
| Dynamic typing, type hints, duck typing | `types.md` |
| List/dict/set gotchas, comprehensions | `collections.md` |
| Args/kwargs, closures, decorators, generators | `functions.md` |
| Inheritance, descriptors, metaclasses | `classes.md` |
| GIL, threading, asyncio, multiprocessing | `concurrency.md` |
| Circular imports, packages, __init__.py | `imports.md` |
| Pytest, mocking, fixtures | `testing.md` |
## Critical Rules
- `def f(items=[])` shares list across all calls โ use `items=None` then `items = items or []`
- `is` checks identity, `==` checks equality โ `"a" * 100 is "a" * 100` may be False
- Modifying list while iterating skips elements โ iterate over copy: `for x in list(items):`
- GIL prevents true parallel Python threads โ use multiprocessing for CPU-bound
- Bare `except:` catches `SystemExit` and `KeyboardInterrupt` โ use `except Exception:`
- `UnboundLocalError` when assigning to outer scope variable โ use `nonlocal` or `global`
- `open()` without context manager leaks handles โ always use `with open():`
- Circular imports fail silently or partially โ import inside function to break cycle
- `0.1 + 0.2 != 0.3` โ floating point, use `decimal.Decimal` for money
- Generator exhausted after one iteration โ can't reuse, recreate or use `itertools.tee`
- Class attributes with mutables shared across instances โ define in `__init__` instead
- `__init__` is not constructor โ `__new__` creates instance, `__init__` initializes
- Default encoding is platform-dependent โ always specify `encoding='utf-8'`