commands python python-2.7 python-3.x if-statement environment-variables

python - commands - ¿Cuál es una buena práctica para verificar si existe o no una variable ambiental?



python path windows 10 (3)

Quiero verificar en mi entorno la existencia de una variable, digamos "FOO" , en Python. Para este propósito, estoy usando la biblioteca estándar del sistema operativo. Después de leer la documentación de la biblioteca, descubrí 2 formas de lograr mi objetivo:

Método 1:

if "FOO" in os.environ: pass

Método 2:

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

Me gustaría saber qué método, si alguno, es un condicional bueno / preferido y por qué.


Existe un caso para cualquiera de las soluciones, dependiendo de lo que desee hacer condicional a la existencia de la variable de entorno.

Caso 1

Cuando desee realizar diferentes acciones basadas únicamente en la existencia de la variable de entorno, sin importar su valor, la primera solución es la mejor práctica. Describe sucintamente para qué se prueba: es ''FOO'' en la lista de variables de entorno.

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

Caso 2

Cuando desee establecer un valor predeterminado si el valor no está definido en las variables de entorno, la segunda solución es realmente útil, aunque no en la forma en que la escribió:

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

o quizás

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

Tenga en cuenta que si tiene varias opciones para su aplicación, es posible que desee buscar en ChainMap , que permite combinar varios dictados en función de las claves. Hay un ejemplo de esto en la documentación de ChainMap :

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


Para estar seguro use

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

Un caso de esquina con las respuestas anteriores es cuando la variable de entorno se establece pero está vacía

Para este caso especial obtienes

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

o

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

Para evitar esto solo use or

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

Entonces obtienes

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

¿Cuándo tenemos variables de entorno vacías?

Olvidó establecer el valor en el archivo .env

# .env FOO=

o exportado como

$ export FOO=

u olvidé configurarlo en settings.py

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

Actualización: en caso de duda, consulte estas frases.

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


Usa el primero; trata directamente de verificar si algo está definido en el environ . Aunque la segunda forma funciona igualmente bien, carece semánticamente ya que obtiene un valor de regreso si existe y solo lo usa para una comparación.

Estás tratando de ver si algo está presente en el medio environ , ¿por qué lo harías solo para compararlo y luego tirarlo ?

Eso es exactamente lo que hace getenv :

Obtenga una variable de entorno , devuelva None si no existe. El segundo argumento opcional puede especificar un valor predeterminado alternativo.

(esto también significa que su cheque podría ser solo if getenv("FOO") )

no quieres obtenerlo , quieres verificar si existe.

De cualquier manera, getenv es solo una envoltura alrededor del medio environ.get pero no ve a las personas que environ.get membresía en las asignaciones con:

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

Para resumir, use:

if "FOO" in os.environ: pass

si solo desea verificar la existencia, mientras usa getenv("FOO") si realmente quiere hacer algo con el valor que podría obtener.