Chcę sprawdzić, czy w moim środowisku istnieje zmienna, powiedzmy "FOO"
, w Pythonie. W tym celu korzystam z os
biblioteki standardowej. Po przeczytaniu dokumentacji biblioteki wymyśliłem 2 sposoby na osiągnięcie celu:
Metoda 1:
if "FOO" in os.environ:
pass
Metoda 2:
if os.getenv("FOO") is not None:
pass
Chciałbym wiedzieć, która metoda jest dobra / preferowana warunkowa i dlaczego.
python
python-2.7
python-3.x
if-statement
environment-variables
Kshitij Saraogi
źródło
źródło
foo
znajduje się w zmiennych env, a nie, jeśli szukaszfoo
wyników wNone
wartościach.Odpowiedzi:
Użyj pierwszego; bezpośrednio próbuje sprawdzić, czy coś jest zdefiniowane w
environ
. Chociaż druga forma działa równie dobrze, brakuje jej semantycznie, ponieważ odzyskujesz wartość, jeśli istnieje, i używasz jej tylko do porównania.Starasz się zobaczyć, czy coś jest obecny w
environ
, dlaczego chcesz się po prostu go porównać, a następnie wrzucić go z dala ?Dokładnie to
getenv
robi:(oznacza to również, że Twój czek może być po prostu
if getenv("FOO")
)nie chcesz tego dostać , chcesz sprawdzić, czy istnieje.
Tak czy inaczej,
getenv
jest to tylko otoka,environ.get
ale nie widać osób sprawdzających członkostwo w mapowaniach za pomocą:Podsumowując, użyj:
jeśli chcesz tylko sprawdzić, czy istnieje, podczas gdy, użyj,
getenv("FOO")
jeśli rzeczywiście chcesz zrobić coś z wartością, którą możesz uzyskać.źródło
Każde rozwiązanie ma swoje uzasadnienie, w zależności od tego, co chcesz zrobić pod warunkiem istnienia zmiennej środowiskowej.
Przypadek 1
Jeśli chcesz podjąć różne działania wyłącznie w oparciu o istnienie zmiennej środowiskowej, nie dbając o jej wartość, najlepszym rozwiązaniem jest pierwsze rozwiązanie. Zwięzle opisuje to, co testujesz: to „FOO” na liście zmiennych środowiskowych.
Przypadek 2
Jeśli chcesz ustawić wartość domyślną, jeśli wartość nie jest zdefiniowana w zmiennych środowiskowych, drugie rozwiązanie jest faktycznie przydatne, chociaż nie w takiej postaci, w jakiej je zapisałeś:
a może
Zauważ, że jeśli masz kilka opcji dla swojej aplikacji, możesz chcieć zajrzeć
ChainMap
, co pozwala na scalenie wielu dykt na podstawie kluczy. W dokumentacji jest tego przykładChainMap
:źródło
Aby być po bezpiecznej stronie
Przykładem narożnym z powyższymi odpowiedziami jest sytuacja, gdy zmienna środowiskowa jest ustawiona, ale jest pusta
W tym szczególnym przypadku otrzymasz
lub
Aby tego uniknąć, po prostu użyj
or
Wtedy masz
Kiedy mamy puste zmienne środowiskowe?
Zapomniałeś ustawić wartość w
.env
plikulub wyeksportowane jako
lub zapomniałem go ustawić
settings.py
Aktualizacja: jeśli masz wątpliwości, sprawdź te jednolinijkowe
źródło
def getenv(key, default=None):
taki, jeśli tak, to powinno pozwolić na domyślną składnię vs składnię lub na początku>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
Jeśli chcesz sprawdzić, czy nie ustawiono wielu zmiennych env, możesz wykonać następujące czynności:
źródło
Mój komentarz może nie odnosić się do podanych tagów. Jednak zostałem poprowadzony na tę stronę z mojego wyszukiwania. Szukałem podobnego czeku w R i przy pomocy posta @hugovdbeg wymyśliłem następujący. Mam nadzieję, że komuś, kto szuka podobnego rozwiązania w R.
źródło