¿Por qué list.append evalúa a falso en un contexto booleano?

¿Hay alguna razón para ser list.append evaluar a falso? ¿O es solo la convención de C de devolver 0 cuando tiene éxito lo que entra en juego?

 >>> u = [] >>> not u.append(6) True 

La mayoría de los métodos de Python que mutan un contenedor en el lugar devuelven None : una aplicación del principio de separación de consulta de comando . (Las cosas de Python siempre son razonablemente pragmáticas, por lo que unos pocos mutadores devuelven un valor utilizable cuando, de lo contrario, sería costoso o desordenado. El método pop es un buen ejemplo de este pragmatismo. Pero esos son definitivamente la excepción, no el regla, y no hay razón para hacer que se append una excepción).

None evalúa como False y en python se supone que una función que no devuelve nada ha devuelto None .

Si escribe:

 >> print u.append(6) None 

Tadaaam 🙂

porque el método .append devuelve None , por not None tanto, not None evalúa como True . Python en error generalmente genera un error:

 >>> a = () >>> a.append(5) Traceback (most recent call last): File "", line 1, in  a.append(5) AttributeError: 'tuple' object has no attribute 'append' 

Modifica la lista en el lugar, y devuelve None . None evalúa como falso.

En realidad, devuelve None

>>> print u.append(6) None >>> print not None True >>>
>>> print u.append(6) None >>> print not None True >>> 

El método append modifica la lista en el lugar y el valor de retorno None

En su caso, está creando una matriz – [6] – sobre la marcha, y luego la descarta. La variable b termina con el valor de retorno de Ninguno.

¿Por qué?
Esto cumple con el principio de separación de comando-consulta ideado por Bertrand Meyer.
Establece que cada método debe ser un comando que realiza una acción o una consulta que devuelve datos a la persona que llama, pero no ambos. En tu ejemplo:

 u.append(6) 

append modificó el estado de [] , por lo que no es una buena práctica devolver un valor que cumpla con el principio.

En términos teóricos, esto establece una medida de cordura, según la cual uno puede razonar sobre el estado de un progtwig sin modificar simultáneamente ese estado.

CQS se adapta bien a la metodología orientada a objetos como python.

La función list.append no devuelve None , solo agrega el valor a la lista que está utilizando para llamar a ese método.

Aquí hay algo para aclarar las cosas:

 >>> u = [] >>> not u False >>> print(u.append(6)) # u.append(6) == None None >>> not u.append(6) # not None == True True