Compruebe si una de las variables está configurada como Ninguna

Hace poco tuve que implementar una pequeña comprobación de cualquier variable que no se haya inicializado (y su valor predeterminado es None ). Se me ocurrió esto:

 if None in (var1, var2, var3): error_out() 

Mientras que, en mi opinión, rozando lo bello, me preguntaba: ¿es esta una buena manera de hacerlo? ¿Es esta la manera de hacerlo? ¿Hay casos en los que esto podría producir algunos resultados inesperados?

Lo primero es lo primero: su código es válido, legible, conciso … por lo que puede que no sea la forma de hacerlo (los modismos evolucionan con el tiempo y las nuevas características del lenguaje), pero ciertamente es una de las maneras de hacerlo de una manera pythonica. .

En segundo lugar, solo dos observaciones:

La forma estándar de generar errores en Python es elevar excepciones . Por supuesto, puede ajustar su aumento de excepciones dentro de una función, pero como es bastante inusual, me preguntaba si había elegido este diseño por alguna razón específica. Ya que puede escribir su propia clase de Excepción, incluso el código de repetición como el registro de un mensaje de error en el archivo podría ir dentro de la clase en lugar de en la función de ajuste.

La forma en que escribió su prueba es tal que no podrá asignar None como un valor a sus variables . Esto podría no ser un problema ahora, pero podría limitar su flexibilidad en el futuro. Una forma alternativa de verificar la inicialización podría ser simplemente no declarar un valor inicial para la variable en cuestión y luego hacer algo como:

 try: self.variable_name except NameError: # here the code that runs if the variable hasn't been initialised finally: # [optional] here the code that should run in either case 

Una forma ligeramente diferente de hacerlo sería utilizar el método integrado all ; sin embargo, esto también detectará valores falsos como 0 o "" , que pueden no ser los que desea:

 >>> all([1, 2, 3]) True >>> all([None, 1, 2]) False >>> all([0, 1]) False 

Permítame dejar mis dos centavos aquí:

 >>> any(a is None for a in [1,0]) False >>> any(a is None for a in [1,0, None]) True 

Así que uno puede:

 def checkNone(*args): if any(arg is None for arg in args): error_out() 

Nada nuevo aquí. En mi humilde opinión, tal vez la parte de any arg is None sea ​​más legible