Zum Hauptinhalt springen
ai-slop/python-mutable-defaultmanuelle Behebung

Mutable Default-Argument.

Ein Funktionsparameter mit dem Default `[]`, `{}` oder `set()`. Python wertet den Default einmal aus, sodass sich alle Aufrufe ohne dieses Argument dasselbe Objekt teilen und verändern.

Beanstandete und saubere Form.

Jedes Beispiel zeigt genau die Codeform, nach der die Regel sucht, und dann die kleinste Version, die die Absicht bewahrt, ohne Risiken zu verstecken oder Rauschen hinzuzufügen.

python-mutable-default.py
✗ Beanstandet
def add_tag(tag, tags=[]):
    tags.append(tag)
    return tags

add_tag("a")  # ["a"]
add_tag("b")  # ["a", "b"]: the default list is shared
Warum das anschlägt

Deterministisches Parsen der Signatur: liest jede `def`-Signatur, auch mehrzeilige, mit maskierten Strings und Kommentaren, und beanstandet einen Parameter, dessen Default `[]`, `{}` oder `set()` ist.

python-mutable-default.py
✓ Sauber
def add_tag(tag, tags=None):
    tags = tags if tags is not None else []
    tags.append(tag)
    return tags
Was sich geändert hat

Setze den Default auf `None` und erzeuge den Wert im Rumpf: `items = items if items is not None else []`.

Agenten schreiben den Default, mit dem jeder Aufruf starten soll – so verhalten sich Defaults in vielen anderen Sprachen. In Python leckt dadurch Zustand zwischen Aufrufen durch.

Wie diese Regel begründet ist.

Regel-ID

ai-slop/python-mutable-default

Prüfende Engine

ai-slop

Erkennungsstrategie

Deterministisches Parsen der Signatur: liest jede `def`-Signatur, auch mehrzeilige, mit maskierten Strings und Kommentaren, und beanstandet einen Parameter, dessen Default `[]`, `{}` oder `set()` ist.

Legitimer Code, der NICHT beanstandet wird

`None`-Defaults, unveränderliche Defaults wie Tupel und leere Literale innerhalb eines Aufrufs (zum Beispiel FastAPIs `Query(default=[])`) werden nicht beanstandet.

Belege

Teil von aislops Python-Regelsatz, in der Strict-Stufe gewertet. Seit v0.15.0 werden Marker-Defaults von FastAPI, typer und pydantic nicht mehr beanstandet.