usar true tipos operadores logicos logica false ejemplos como booleanos python list pycharm pep8

true - python logica



¿Es incorrecto usar el operador “==” cuando se compara con una lista vacía? (2)

Citando la sección de Recomendaciones de Programación de PEP-8 ,

Para las secuencias (cadenas, listas, tuplas), use el hecho de que las secuencias vacías son falsas.

Yes: if not seq: if seq: No: if len(seq) if not len(seq)

Ya que las secuencias vacías son Falsy en Python,

>>> bool([]) False >>> bool(()) False

simplemente puede utilizar if not como se menciona en el PEP-8.

Nota: Nunca debe usar is para comparar si dos valores son iguales, ya is operador verifica si dos objetos son uno y el mismo, pero == comprueba si dos objetos son iguales.

Busqué en el código fuente para averiguar qué está sucediendo. Cuando hacemos a == [] ,

>>> dis(compile(''if a == []: pass'', "string", "exec")) 1 0 LOAD_NAME 0 (a) 3 BUILD_LIST 0 6 COMPARE_OP 2 (==) 9 POP_JUMP_IF_FALSE 15 12 JUMP_FORWARD 0 (to 15) >> 15 LOAD_CONST 0 (None) 18 RETURN_VALUE

estamos construyendo una nueva lista y sería una operación muy costosa, solo para comparación. Por otra parte

>>> dis(compile(''if not a: pass'', "string", "exec")) 1 0 LOAD_NAME 0 (a) 3 POP_JUMP_IF_TRUE 9 6 JUMP_FORWARD 0 (to 9) >> 9 LOAD_CONST 0 (None) 12 RETURN_VALUE

estamos tratando de ver si la secuencia actual podría ser Truthy. Esto verifica internamente si la longitud de la secuencia es cero (que es solo una búsqueda simple, ya que la longitud de la lista se mantiene en una variable). Si la longitud es cero, entonces if not actions: será Truthy. Aquí no construimos una nueva lista, sino que simplemente estamos verificando la longitud implícitamente, en lugar de hacerlo explícitamente

if len(actions) == 0:

Por lo tanto, supongo que los gurús de Python están sugiriendo, if not seq porque también podría haber una ventaja de rendimiento.

Esta pregunta ya tiene una respuesta aquí:

PyCharm (4.0.6) se queja cuando hago una comparación con una lista vacía usando el operador == , pero no cuando uso el operador is :

Supongo que esto es algo relacionado con PEP 8, pero el problema es que cuando uso el operador is , como sugiere PyCharm, tengo un falso negativo. Aquí hay un ejemplo simple en el shell de iPython para mostrar que en este caso el operador == parece más apropiado, ya que el operador is devuelve un falso negativo:

In[2]: actions = [] In[3]: actions == [] Out[3]: True In[4]: actions is [] Out[4]: False

¿Podría alguien explicar por qué PyCharm se queja sobre el operador == cuando se compara con una lista vacía? ¿Estoy haciendo algo mal según PEP 8?


Según el documento PEP8 debes usar

For sequences, (strings, lists, tuples), use the fact that empty sequences are false. Yes: if not seq: if seq: No: if len(seq) if not len(seq)