Intento refactorizar las condiciones compuestas

if not foo in categories and not foo.capitalize() in categories:

A códigos como

if not foo and foo.capitalize() in categories:

No funcionó.

1
user8445949 31 oct. 2017 a las 10:11

3 respuestas

La mejor respuesta

Entonces sabes que esto funciona:

if not foo in categories and not foo.capitalize() in categories:

Se analiza como (not (foo in categories)) and (not (foo.capitalize() in categories), es decir

  • foo no está en categorías, y
  • foo.capitalize () no está en categorías.

Dado que el análisis siempre funciona de la misma manera y no adivina lo que es más probable que signifique, su declaración revisada

if not foo and foo.capitalize() in categories:

Se analiza como (not foo) and (foo.capitalize() in categories), es decir

  • foo no es, y
  • foo.capitalize () está en las categorías

Una forma más limpia de escribir esto en Python es con x not in y en lugar de not x in y (son equivalentes):

if foo not in categories and foo.capitalize() not in categories:

Pero en cuanto a expresar "ninguno de estos" de forma breve aquí ... no hay mucho más allá de los operadores establecidos:

if not {foo, foo.capitalize()}.intersection(categories):

Taquigrafía si categories también es un conjunto:

if not {foo, foo.capitalize()} & categories:

Observe que no es mucho más corto y que es más difícil de entender.

4
Ry- 31 oct. 2017 a las 07:20

Lo que está haciendo es verificar si foo es False y foo.capitalize() está en categories.

0
Mitiku 31 oct. 2017 a las 07:16

Si tiene casos específicos de all and / not / or como mencionó anteriormente, generalmente hago lo siguiente:

if not all( [foo in categories, foo.capitalize() in categories] ):

Facilita la legibilidad y la depuración también es simple

ver este hilo por ejemplo

0
NoobEditor 31 oct. 2017 a las 07:27