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.