it-swarm.com.de

Was ist eine gute Vorgehensweise, um zu überprüfen, ob eine Umgebungsvariable vorhanden ist oder nicht?

Ich möchte meine Umgebung auf das Vorhandensein einer Variablen überprüfen, z. B. "FOO", in Python. Zu diesem Zweck verwende ich die Standardbibliothek os. Nachdem ich die Dokumentation der Bibliothek gelesen habe, habe ich zwei Wege gefunden, um mein Ziel zu erreichen:

Methode 1:

if "FOO" in os.environ:
    pass

Methode 2:

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

Ich würde gerne wissen, welche Methode eine gute/bevorzugte Bedingung ist und warum.

90
Kshitij Saraogi

Verwende die erste. es wird direkt versucht zu überprüfen, ob etwas in environ definiert ist. Obwohl die zweite Form genauso gut funktioniert, fehlt sie semantisch, da Sie einen Wert zurückerhalten, falls vorhanden, und nur ihn für einen Vergleich verwenden.

Du versuchst zu sehen, ob etwas vorhanden ist inenviron, warum würdest du bekommen nur um es zu vergleichen und dann wegzuwerfen?

Genau das macht getenv:

Hole eine Umgebungsvariable, gebe None zurück, wenn es nicht existiert. Das optionale zweite Argument kann einen alternativen Standardwert angeben.

(Dies bedeutet auch, dass Ihr Scheck nur if getenv("FOO") sein könnte.)

du willst nicht hol es dir, du willst überprüfen, ob es existiert.

So oder so ist getenv nur ein Wrapper um environ.get, Aber Sie sehen keine Leute, die in Mappings nach einer Mitgliedschaft suchen mit:

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

Verwenden Sie zum Zusammenfassen:

if "FOO" in os.environ:
    pass

wenn Sie nur auf Existenz prüfen möchten, verwenden Sie getenv("FOO"), wenn Sie tatsächlich etwas mit dem Wert tun möchten, den Sie möglicherweise erhalten.

114

Für beide Lösungen gibt es einen Fall, abhängig davon, was Sie tun möchten, abhängig vom Vorhandensein der Umgebungsvariablen.

Fall 1

Wenn Sie verschiedene Aktionen basierend auf der Existenz der Umgebungsvariablen ausführen möchten, ohne auf deren Wert zu achten, ist die erste Lösung die beste Vorgehensweise. Es beschreibt kurz und bündig, auf was Sie testen: ist 'FOO' in der Liste der Umgebungsvariablen.

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

Fall 2

Wenn Sie einen Standardwert festlegen möchten, wenn der Wert nicht in den Umgebungsvariablen definiert ist, ist die zweite Lösung tatsächlich nützlich, jedoch nicht in der Form, in der Sie sie geschrieben haben:

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

oder vielleicht

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

Beachten Sie, dass Sie, wenn Sie mehrere Optionen für Ihre Anwendung haben, möglicherweise ChainMap prüfen möchten, um mehrere Wörter basierend auf Schlüsseln zusammenzuführen. Ein Beispiel hierfür finden Sie in der Dokumentation zu ChainMap:

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

Um auf der sicheren Seite zu sein, verwenden Sie

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

Ein Eckfall mit den obigen Antworten ist, wenn die Umgebungsvariable gesetzt, aber leer ist

Für diesen speziellen Fall bekommen Sie

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

oder

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

Um dies zu vermeiden, verwenden Sie einfach or

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

Dann bekommst du

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

Wann haben wir leere Umgebungsvariablen?

Sie haben vergessen, den Wert im .env Datei

# .env
FOO=

oder exportiert als

$ export FOO=

oder vergessen, es in settings.py

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

pdate: Im Zweifelsfall schauen Sie sich diese Einzeiler an

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

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