Apa praktik yang baik untuk memeriksa apakah ada variabel lingkungan atau tidak?

130

Saya ingin memeriksa lingkungan saya untuk keberadaan variabel, katakanlah "FOO", dengan Python. Untuk tujuan ini, saya menggunakan osperpustakaan standar. Setelah membaca dokumentasi perpustakaan, saya menemukan 2 cara untuk mencapai tujuan saya:

Metode 1:

if "FOO" in os.environ:
    pass

Metode 2:

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

Saya ingin tahu metode mana, jika salah satu, adalah syarat yang baik / disukai dan mengapa.

Kshitij Saraogi
sumber
Ini terutama berdasarkan opini. Keduanya melayani tujuan yang sama. Saya akan memilih metode 1 karena lebih bersih
Moinuddin Quadri
1
Saya tidak bisa mengatakan ada sesuatu di dalamnya. Pilih satu (lempar koin?) Dan evaluasi kembali nanti jika ternyata tidak berhasil. Terus terang saya pikir Anda telah menghabiskan lebih banyak waktu mengetik pertanyaan ini daripada Anda akan menghemat baik!
jonrsharpe
1
@Ayoub: Saya pikir Anda lupa melihat pertanyaan "Apa praktik yang baik untuk memeriksa apakah ada variabel lingkungan di Python?"
Moinuddin Quadri
1
Pendapat berdasarkan. Metode 1 sintaks berfungsi lebih baik, karena Anda bertanya apakah fooada di env vars, bukan jika mencari foohasil dalam Nonenilai.
Uriel
1
Tapi cara itu mungkin tidak jelas, kecuali Anda orang Belanda ...
jonrsharpe

Jawaban:

168

Gunakan yang pertama; itu langsung mencoba untuk memeriksa apakah ada sesuatu yang didefinisikan dalam environ. Meskipun bentuk kedua berfungsi sama baiknya, bentuk ini kurang semantik karena Anda mendapatkan nilai kembali jika ada dan hanya ada menggunakannya untuk perbandingan.

Anda mencoba untuk melihat apakah ada sesuatu yang hadir dalam environ , mengapa Anda akan mendapatkan hanya untuk membandingkan dan kemudian melemparkannya jauh ?

Itulah tepatnya yang getenvterjadi:

Dapatkan variabel lingkungan , kembalikan Nonejika tidak ada. Argumen opsional kedua dapat menentukan standar alternatif.

(Ini juga berarti cek Anda mungkin saja if getenv("FOO"))

Anda tidak ingin mendapatkannya , Anda ingin memeriksa keberadaannya.

Either way, getenvhanya pembungkus environ.gettetapi Anda tidak melihat orang memeriksa keanggotaan dalam pemetaan dengan:

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

Untuk meringkas, gunakan:

if "FOO" in os.environ:
    pass

jika Anda hanya ingin memeriksa keberadaan, sementara, gunakan getenv("FOO")jika Anda benar-benar ingin melakukan sesuatu dengan nilai yang mungkin Anda dapatkan.

Dimitris Fasarakis Hilliard
sumber
2
Terima kasih atas penjelasan anda Saya akan mengingat hal ini.
Kshitij Saraogi
29

Ada kasus untuk salah satu solusi, tergantung pada apa yang ingin Anda lakukan tergantung pada keberadaan variabel lingkungan.

Kasus 1

Ketika Anda ingin mengambil tindakan berbeda berdasarkan pada keberadaan variabel lingkungan, tanpa memperhatikan nilainya, solusi pertama adalah praktik terbaik. Ini secara ringkas menjelaskan apa yang Anda uji: adalah 'FOO' dalam daftar variabel lingkungan.

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

Kasus 2

Ketika Anda ingin menetapkan nilai default jika nilai tidak didefinisikan dalam variabel lingkungan, solusi kedua sebenarnya berguna, meskipun tidak dalam bentuk yang Anda tulis:

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

atau mungkin

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

Perhatikan bahwa jika Anda memiliki beberapa opsi untuk aplikasi Anda, Anda mungkin ingin melihatnya ChainMap, yang memungkinkan untuk menggabungkan beberapa dicts berdasarkan kunci. Ada contohnya di ChainMapdokumentasi ini:

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

Agar aman digunakan

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

Kasus sudut dengan jawaban di atas adalah ketika variabel lingkungan ditetapkan tetapi kosong

Untuk kasus khusus ini Anda dapatkan

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

atau

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

Untuk menghindari ini gunakan saja or

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

Lalu kamu dapatkan

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

Kapan kita memiliki variabel lingkungan kosong?

Anda lupa mengatur nilai dalam .envfile

# .env
FOO=

atau diekspor sebagai

$ export FOO=

atau lupa mengaturnya settings.py

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

Perbarui: jika ragu, periksa ini satu-baris

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

$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
Levon
sumber
Tanda tangan untuk getenv def getenv(key, default=None):begitu jika demikian yang memungkinkan default vs the atau sintaks pada awalnya
Chris McKee
@ Chris McKee coba ini>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
Levon
Tanda tangan metode menyesatkan 😜
Chris McKee
1
@ Chris McKee, contoh lain$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
Levon
3

Jika Anda ingin memeriksa apakah beberapa variabel env tidak disetel, Anda dapat melakukan hal berikut:

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))
vhamon
sumber
-1

Komentar saya mungkin tidak relevan dengan tag yang diberikan. Namun, saya diarahkan ke halaman ini dari pencarian saya. Saya sedang mencari cek serupa di R dan saya datang berikut dengan bantuan pos @hugovdbeg. Saya harap ini akan membantu bagi seseorang yang mencari solusi serupa di R

'USERNAME' %in% names(Sys.getenv())
sveer
sumber