web-dev-qa-db-fra.com

Quelle est la bonne pratique pour vérifier si une variable environnementale existe ou non?

Je veux vérifier dans mon environnement l'existence d'une variable, par exemple "FOO", en Python. Pour ce faire, j'utilise la bibliothèque standard os. Après avoir lu la documentation de la bibliothèque, j'ai découvert 2 façons d'atteindre mon objectif:

Méthode 1:

if "FOO" in os.environ:
    pass

Méthode 2:

if os.getenv("FOO") is not None:
    pass

J'aimerais savoir quelle méthode, si l'une ou l'autre est un conditionnel bon/préféré et pourquoi.

90
Kshitij Saraogi

Utilisez le premier. il essaie directement de vérifier si quelque chose est défini dans environ. Bien que la seconde forme fonctionne aussi bien, elle manque sémantiquement car vous obtenez une valeur si elle existe et niquement utilisez-la pour une comparaison.

Vous essayez de voir si quelque chose est présent inenviron, pourquoi voudriez-vous obtenir juste pour le comparer et ensuite le jeter de côté =?

C'est exactement ce que getenv fait:

Récupère une variable d'environnement, retourne None s'il n'existe pas. Le deuxième argument facultatif peut spécifier une valeur par défaut alternative.

(cela signifie également que votre chèque pourrait simplement être if getenv("FOO"))

vous ne voulez pas l'obtenir, vous voulez vérifier son existence.

Quoi qu'il en soit, getenv est simplement un wrapper autour de environ.get, mais vous ne voyez pas les gens vérifier l'adhérence aux mappages avec:

from os import environ
if environ.get('Foo') is not None:

Pour résumer, utilisez:

if "FOO" in os.environ:
    pass

si vous juste voulez vérifier son existence, utilisez getenv("FOO") si vous voulez réellement faire quelque chose avec la valeur que vous pourriez obtenir.

114

Il existe un cas pour l'une ou l'autre solution, selon ce que vous voulez faire, en fonction de l'existence de la variable d'environnement.

Cas 1

Lorsque vous souhaitez effectuer différentes actions uniquement en fonction de l'existence de la variable d'environnement, sans vous soucier de sa valeur, la première solution est la meilleure pratique. Il décrit succinctement ce que vous testez: est 'FOO' dans la liste des variables d’environnement.

if 'KITTEN_ALLERGY' in os.environ:
    buy_puppy()
else:
    buy_kitten()

Cas 2

Lorsque vous souhaitez définir une valeur par défaut si la valeur n'est pas définie dans les variables d'environnement, la deuxième solution est utile, mais pas sous la forme dans laquelle vous l'avez écrite:

server = os.getenv('MY_CAT_STREAMS', 'youtube.com')

ou peut-être

server = os.environ.get('MY_CAT_STREAMS', 'youtube.com')

Notez que si vous avez plusieurs options pour votre application, vous voudrez peut-être examiner ChainMap , qui permet de fusionner plusieurs plans en fonction de clés. Il existe un exemple dans la documentation ChainMap:

[...]
combined = ChainMap(command_line_args, os.environ, defaults)
17
hugovdberg

Pour être prudent, utilisez

os.getenv('FOO') or 'bar'

Un cas de coin avec les réponses ci-dessus est lorsque la variable d'environnement est définie mais est vide

Pour ce cas particulier, vous obtenez

print(os.getenv('FOO', 'bar'))
# prints new line - though you expected `bar`

ou

if "FOO" in os.environ:
    print("FOO is here")
# prints FOO is here - however its not

Pour éviter cela, utilisez simplement or

os.getenv('FOO') or 'bar'

Alors vous obtenez

print(os.getenv('FOO') or 'bar')
# bar

Quand avons-nous des variables d'environnement vides?

Vous avez oublié de définir la valeur dans le fichier .env

# .env
FOO=

ou exporté en tant que

$ export FOO=

ou oublié de le définir dans settings.py

# settings.py
os.environ['FOO'] = ''

Mise à jour: en cas de doute, jetez un œil à ces one-liners

>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))

$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
9
Levon