Aller au contenu

global-state-dependency

Catégorie : Injection de dépendances
Sévérité : Erreur
Déclenché par : pyscn analyze, pyscn check --select di

Ce que fait cette règle

Signale une méthode de classe qui utilise une instruction global pour lire ou modifier un état au niveau du module.

Pourquoi est-ce un problème ?

Un global à l'intérieur d'une méthode lie la classe à une variable de module spécifique qui n'est pas visible depuis l'interface de la classe. Rien dans OrderService(...) n'indique à un lecteur que la construire ne suffit pas — une valeur au niveau du module doit aussi être amorcée, sinon la méthode se comportera de manière inattendue.

Les tests en souffrent le plus. Pour exercer une méthode qui touche un état global, chaque test doit accéder au module, sauvegarder l'ancienne valeur, en installer une nouvelle et la restaurer au teardown — et tout test qui oublie de nettoyer laisse fuiter l'état vers le suivant. Exécuter les tests en parallèle devient dangereux.

La dépendance est réelle ; elle est simplement cachée. En faire un paramètre explicite du constructeur supprime la surprise.

Exemple

_current_user = None

class AuditLog:
    def record(self, action):
        global _current_user
        entry = {"user": _current_user, "action": action}
        db.insert("audit", entry)

À utiliser à la place

Passez la valeur via __init__ pour que la dépendance soit visible et substituable.

class AuditLog:
    def __init__(self, user):
        self.user = user

    def record(self, action):
        db.insert("audit", {"user": self.user, "action": action})

Options

Option Défaut Description
di.enabled false Doit être true pour qu'analyze exécute les règles DI.
di.min_severity "warning" Cette règle se signale au niveau error ; elle est affichée sauf si min_severity est élevée au-dessus de error.

Références