Quiero verificar en mi entorno la existencia de una variable, por ejemplo "FOO"
, en Python. Para este propósito, estoy usando la os
biblioteca estándar. 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é.
python
python-2.7
python-3.x
if-statement
environment-variables
Kshitij Saraogi
fuente
fuente
foo
está en el entorno, no si se buscanfoo
resultados enNone
valores.Respuestas:
Usa el primero; trata directamente de verificar si algo está definido en
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.Usted está tratando de ver si algo está presente en
environ
, ¿por qué tener sólo para comparar y luego tirar a la basura ?Eso es exactamente lo que
getenv
hace:(esto también significa que su cheque podría ser
if getenv("FOO")
)no quieres obtenerlo , quieres verificar si existe.
De cualquier manera,
getenv
es solo una envoltura,environ.get
pero no ves a las personas que buscan membresía en las asignaciones con:Para resumir, use:
si solo desea verificar la existencia, mientras lo usa,
getenv("FOO")
si realmente desea hacer algo con el valor que podría obtener.fuente
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.
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ó:
o quizás
Tenga en cuenta que si tiene varias opciones para su aplicación, es posible que desee analizar
ChainMap
, lo que permite combinar varios dictados basados en claves. Hay un ejemplo de esto en laChainMap
documentación:fuente
Para estar seguro use
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
o
Para evitar esto solo use
or
Entonces obtienes
¿Cuándo tenemos variables de entorno vacías?
Olvidó establecer el valor en el
.env
archivoo exportado como
u olvidé configurarlo
settings.py
Actualización: si tiene dudas, consulte estas frases.
fuente
def getenv(key, default=None):
así, si es así, debería permitir una sintaxis predeterminada frente a la o al principio>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
En caso de que desee comprobar si no se establecen múltiples variables env, puede hacer lo siguiente:
fuente
Mi comentario podría no ser relevante para las etiquetas dadas. Sin embargo, fui llevado a esta página desde mi búsqueda. Estaba buscando un control similar en R y se me ocurrió lo siguiente con la ayuda de @hugovdbeg post. Espero que sea útil para alguien que está buscando una solución similar en R
fuente