Çevresel bir değişkenin var olup olmadığını kontrol etmek için iyi bir uygulama nedir?


130

Örneğin "FOO"Python'da bir değişkenin varlığı için ortamımı kontrol etmek istiyorum . Bu amaçla osstandart kitaplığı kullanıyorum . Kütüphanenin belgelerini okuduktan sonra, hedefime ulaşmak için 2 yol buldum:

Yöntem 1:

if "FOO" in os.environ:
    pass

Yöntem 2:

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

Hangi yöntemin iyi / tercih edilen koşullu olduğunu ve nedenini bilmek istiyorum.


Öncelikle fikir temellidir. Her ikisi de aynı amaca hizmet eder. Daha temiz olduğu için 1. yöntemi tercih edeceğim
Moinuddin Quadri

1
İçinde bir şey olduğunu söyleyemem. Birini seçin (yazı tura atmak mı?) Ve işe yaramazsa daha sonra yeniden değerlendirin. Açıkçası, bu soruyu yazmak için her iki şekilde de tasarruf edeceğinizden daha fazla zaman harcadığınızı düşünüyorum!
jonrsharpe

1
@Ayoub: " Python'da bir çevresel değişken olup olmadığını kontrol etmek için iyi bir uygulama nedir?"
Moinuddin Quadri

1
Fikir temelli. Yöntem 1 sözdizimi daha iyi hizmet eder, çünkü değerlerde sonuç fooararken değil, ortam değişkenlerinde olup olmadığını sorarsınız . fooNone
Uriel

1
Ama Hollandalı değilseniz bu yol açık olmayabilir ...
jonrsharpe

Yanıtlar:


168

İlkini kullanın; doğrudan bir şeyin içinde tanımlanıp tanımlanmadığını kontrol etmeye çalışır environ. İkinci biçim eşit derecede iyi çalışsa da, eğer varsa geri bir değer aldığınız ve onu yalnızca bir karşılaştırma için kullandığınız için anlamsal olarak eksiktir .

Bir şey mevcut olup olmadığını görmek için çalışıyoruz içinde environ neden olur, olsun karşılaştırmak için sadece ve sonra çöpe atmak ?

Bu tam olarak ne getenvyapar:

Bir ortam değişkeni alın , Noneyoksa geri dönün . İsteğe bağlı ikinci bağımsız değişken, alternatif bir varsayılan belirtebilir.

(bu aynı zamanda çekinizin olabileceği anlamına gelir if getenv("FOO"))

Eğer istemiyorsanız bunu elde , sen 's varlığı için kontrol etmek istiyorum.

Her iki durumda da getenv, sadece etrafta bir sarmalayıcıdır, environ.getancak aşağıdakilerle eşlemelerde üyeliği kontrol eden insanları görmezsiniz:

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

Özetlemek için şunu kullanın:

if "FOO" in os.environ:
    pass

eğer sadece kullanımı sırasında, varlığını denetlemek için istediğiniz getenv("FOO")aslında sen alabilirsiniz değere sahip bir şey yapmak istiyorum.


2
Açıklaman için teşekkürler. Bunu aklımda tutacağım.
Kshitij Saraogi

29

Ortam değişkeninin varlığına bağlı olarak ne yapmak istediğinize bağlı olarak her iki çözüm için de bir durum vardır.

Dava 1

Değerine aldırmadan, tamamen ortam değişkeninin varlığına dayalı olarak farklı eylemler gerçekleştirmek istediğinizde, ilk çözüm en iyi uygulamadır. Kısaca, neyi test ettiğinizi açıklar: ortam değişkenleri listesinde 'FOO'.

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

Durum 2

Varsayılan bir değer ayarlamak istediğinizde, değer ortam değişkenlerinde tanımlanmamışsa, ikinci çözüm, yazdığınız biçimde olmasa da aslında kullanışlıdır:

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

ya da belki

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

Uygulamanız için birkaç seçeneğiniz varsa ChainMap, anahtarlara göre birden çok dikti birleştirmeye izin veren, araştırmak isteyebileceğinizi unutmayın . ChainMapDokümantasyonda bunun bir örneği var :

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

15

Güvenli tarafta olmak için kullanım

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

Yukarıdaki cevaplara sahip bir köşe durumu, ortam değişkeninin ayarlandığı ancak boş olduğu durumdur.

Bu özel durum için

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

veya

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

Bundan kaçınmak için sadece kullanın or

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

Sonra alırsın

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

Ne zaman boş ortam değişkenlerimiz olur?

.envDosyadaki değeri ayarlamayı unuttunuz

# .env
FOO=

veya olarak dışa aktarıldı

$ export FOO=

veya ayarlamayı unuttum settings.py

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

Güncelleme: Şüpheniz varsa, bu tek gömlekleri inceleyin

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

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

Getenv imzası, def getenv(key, default=None):eğer öyleyse, başlangıçta veya sözdizimine karşı bir varsayılana izin vermelidir
Chris McKee

@Chris McKee bunu dene>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
Levon

Yanıltıcı yöntem imzası 😜
Chris McKee

1
@Chris McKee, başka bir örnek$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
Levon

3

Birden çok env değişkeninin ayarlanıp ayarlanmadığını kontrol etmek istemeniz durumunda, aşağıdakileri yapabilirsiniz:

import os

MANDATORY_ENV_VARS = ["FOO", "BAR"]

for var in MANDATORY_ENV_VARS:
    if var not in os.environ:
        raise EnvironmentError("Failed because {} is not set.".format(var))

-1

Yorumum verilen etiketlerle alakalı olmayabilir. Ancak, aramamdan bu sayfaya yönlendirildim. R'de benzer bir çek arıyordum ve @hugovdbeg yazısının yardımıyla aşağıdakileri buldum. Umarım R'de benzer bir çözüm arayan biri için yararlı olur.

'USERNAME' %in% names(Sys.getenv())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.