Design or review public Python function and method signatures for safe defaults, clear parameter ordering, and explicit call-site contracts.
Choose clear, safe public Python signature rules without drifting into full type-hint policy, class design, or runtime model selection.
Use this skill when:
*args / **kwargs, or crowded parameter listsDo not use this skill when:
Enum, dataclass, ABC, or ProtocolNone is a legal business value or only a missing/default signalpython-type-hints-strict.[], {}, set(), and other shared mutable objects; prefer None plus fresh per-call initialization when emptiness is the real default.None, numbers, strings, booleans, tuples, frozensets, enum members, and stable constants when they match the API contract.None as the default missing signal when None is not itself a valid business value; use a private sentinel such as _MISSING only when the API must distinguish "not provided" from "explicitly passed as None".*args / **kwargs by default; allow them only for narrow wrapper, adapter, or framework-required signatures, and extract a parameter object when the explicit signature becomes too wide.tags: tuple[str, ...] = () for a fixed immutable default, or items: list[str] | None = None plus per-call initialization; force send_notify to be keyword-only when the flag must remain.def send(items: list[str] = []): ..., hide public options in **kwargs, or stack multiple boolean flags into one crowded signature.python-type-hints-strict for that.python-model-selection when the API should extract one./) in the first draft except as an explicit out-of-scope note.examples.md: mutable-default examples, sentinel patterns, keyword-only and flag cases, fat-signature refactors, and split signals