Declaración de “retorno no” de Python en el código de retorno de subproceso

Acabo de encontrar una línea de código muy extraña en Python:

.... self.myReturnCode = externalProcessPopen.returncode .... .... return not self.myReturnCode .... 

¿Qué es exactamente el return not significa? Soy consciente de que el código de retorno de un proceso de Popen es Ninguno mientras aún se está ejecutando y un número aleatorio una vez que se completa y sale con éxito. Pero, ¿qué es exactamente lo que el autor del código intenta lograr aquí?

También podría valer la pena tener en cuenta que el mismo autor más adelante verifica el código de retorno de esta manera:

 if not testClass.testFunction(): logger.error('Failed to execute Function') .... 

not es un operador booleano que devuelve el inverso booleano del valor. return devuelve el resultado de ese operador. En otras palabras, la expresión debe leerse como return (not self.myReturnCode) . Citando la documentación:

El operador not arroja True si su argumento es falso, False contrario.

Si self.myReturnCode es un valor verdadero, not self.myReturnCode es False , y viceversa. Tenga en cuenta que self.myReturnCode puede ser cualquier valor de Python, pero not siempre devuelve un valor booleano, ya sea True o False .

Si externalProcessPopen.returncode es el código de retorno de un proceso externo, entonces será un número entero positivo si el proceso salió con un error, 0 si salió correctamente. Esto se llama el estado de salida del proceso ; qué valores distintos de cero se devuelven depende completamente del proceso. not 0 es entonces True , not 1 (o un valor entero más alto) le da False .

Si es None , entonces también se devolverá True ( not None es True ), pero un código de retorno de subprocess.Popen() es solo None si el proceso aún no ha finalizado.

 return not self.myReturnCode 

debe ser interpretado como:

 return (not self.myReturnCode) 

Lo que está haciendo en su código es simplemente esto:

  • Si el código de retorno es 0 entonces devuelva True
  • Si el código de retorno no es 0 , devuelva False .

No sería un número aleatorio, es el código de retorno del proceso externo, donde cero indica éxito y un número distinto de cero indica error.

Por lo tanto, devolver not self.myReturnCode significa que devuelve True cuando el proceso tuvo éxito y False cuando el proceso indicó un error.

 return not self.myReturnCode 

es equivalente a:

 return False if self.myReturnCode else True