29

Ich möchte meine Umgebung auf die Existenz einer Variablen überprüfen, sagen "FOO", in Python. Zu diesem Zweck verwende ich die os Standardbibliothek. Nach dem Lesen der Dokumentation der Bibliothek, ich habe zwei Wege herausgefunden, mein Ziel zu erreichen:Was ist eine gute Praxis, um zu überprüfen, ob eine Umgebungsvariable existiert oder nicht?

Methode 1:

if "FOO" in os.environ: 
    pass 

Methode 2:

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

Ich möchte, welche Methode wissen, wenn Entweder ist eine gute/bevorzugte Bedingung und warum.

+0

Es ist hauptsächlich auf der Meinung basiert. Beide dienen demselben Zweck. Ich werde Methode 1 bevorzugen, da es sauberer ist –

+0

Ich kann nicht sagen, dass da etwas drin ist. Wählen Sie einen aus (werfen Sie eine Münze?) Und bewerten Sie später neu, wenn es sich herausstellt, dass es nicht funktioniert. Ehrlich gesagt denke ich, dass Sie mehr Zeit damit verbracht haben, diese Frage zu tippen, als Sie in jeder Hinsicht sparen würden! – jonrsharpe

+0

Meinung basiert. Ich würde das erste verwenden, aber es liegt an dir. –

Antwort

38

Verwenden Sie die erste; es versucht direkt zu überprüfen, ob etwas in environ definiert ist. Obwohl die zweite Form genauso gut funktioniert, fehlt sie semantisch, da Sie einen Wert zurück erhalten, wenn er existiert, und nur verwenden Sie es für einen Vergleich.

Sie versuchen, vorhanden ist, etwas zu sehen, ob inenviron, warum würden Sie bekommen nur um es zu vergleichen und dann werfen weg?

Das ist genau das, was getenv tut:

eine Umgebungsvariable erhalten, kehren None wenn es nicht existiert. Das optionale zweite Argument kann einen alternativen Standard angeben.

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

Sie wollen nicht es bekommen, Sie wollen prüfen es Existenz ist.

So oder so ist getenv nur ein Wrapper um environ.get aber Sie sehen nicht die Menschen für die Mitgliedschaft Überprüfung in Mappings mit:

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

Zusammengefasst Verwendung:

if "FOO" in os.environ: 
    pass 

wenn Sie nur wollen auf Existenz prüfen, während, verwenden Sie getenv("FOO"), wenn Sie tatsächlich etwas mit dem Wert tun möchten, die Sie erhalten könnten.

+2

Danke für Ihre Erklärung. Das werde ich mir merken. –

4

Es gibt einen Fall für beide Lösungen, abhängig davon, was Sie tun möchten, abhängig von der Existenz der Umgebungsvariablen.

Fall 1

Wenn Sie rein verschiedene Aktionen nehmen wollen auf die Existenz der Umgebungsvariablen basiert, ohne ihren Wert Pflege, ist die erste Lösung, die beste Praxis. Es beschreibt kurz, 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 gesetzt werden soll, wenn der Wert nicht in den Umgebungsvariablen die zweite Lösung tatsächlich nützlich ist, definiert ist, wenn auch nicht in der Form, die Sie schrieb:

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

oder vielleicht

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

Beachten Sie, wenn Sie mehrere Optionen für Ihre appl Vielleicht möchten Sie in ChainMap suchen, die ermöglicht, mehrere Dicts basierend auf Schlüsseln zusammenzuführen. Es gibt ein Beispiel dafür in der ChainMap Dokumentation:

[...] 
combined = ChainMap(command_line_args, os.environ, defaults) 
Verwandte Themen