Lorsque vous utilisez os.getenv
pour récupérer des variables d'environnement, le comportement par défaut renvoie un type de Optional[str]
. Cela pose un problème car toutes les méthodes/fonctions en aval qui utilisent ces variables seront probablement définies pour accepter une variable str
de manière explicite. Existe-t-il une utilisation acceptée pour contourner ce problème ou pour faire respecter l'obligation d'information ? str
type de retour ?
Dans la définition du fichier stub pour getenv
sur typeshed vous pouvez trouver que getenv
peut avoir un type de retour de Optional[str]
ou Union[str, T_]
en fonction de l'utilisation de la default
kwarg.
Les quatre options que je vois pour l'instant sont les suivantes :
- Définir toute opération en aval à accepter
Optional[str]
en tant qu'arguments. Cela ne semble pas particulièrement correct, car une fonction/méthode peut ne pas être structurée de manière à ce que l'outil d'évaluation de l'impact sur l'environnement soit utilisé.Optional
a un sens, c'est-à-dire que l'opération n'a aucune raison pour qu'un argument particulier soitNone
. - Utilisez le
default
kwarg pourgetenv
et fournir unstr
valeur par défaut. Cela semble plus correct, mais exige que l'on définisse une valeur par défaut pour chaque utilisation de l'optiongetenv
. Le seul problème que je vois dans cette démarche est qu'elle peut être source de confusion pour les tests ou l'utilisation dans des environnements différents. - Définissez une sorte de fonction de vérification des variables. Il peut s'agir d'une fonction qui accepte le nom d'une variable d'environnement à charger, renvoie explicitement une chaîne de caractères et génère une erreur si la variable d'environnement n'existe pas.
- Définir explicitement le type de la valeur retournée par
getenv
pour être un str. Je n'aime vraiment pas cela, car cela suppose que l'environnement est toujours correctement configuré, ce qui, d'après mon expérience, n'est pas une bonne supposition.
Trouvez ci-dessous un exemple qui soulève une erreur mypy.
import os
SOME_VAR = os.getenv("SOME_VAR")
def some_func(val: str) -> None:
print(f"Loaded env var: {val}")
some_func(SOME_VAR)
Ce qui précède soulève l'erreur mypy :
erreur : L'argument 1 de "some_func" est d'un type incompatible "Optional[str]" ; on attendait "str".