Pregunta

¿Cual es mejor?

if not var:
    var = get_var()
(o)

var = var o get_var()

Además, ¿cómo puedo saber cuál es mejor de los dos?
editar:
Una opción más de steve,

var = var if var else get_var()
¿Fue útil?

Solución

El mejor es el que más le guste mejor. Yo usaría primera versión con if pero esto es muy personal.

Otros consejos

Cuando dos variaciones de estilo son tan cerca estilísticamente, lo uso como timeit el desempate: más rápido debe significar más cercano a la corriente principal de Python, es decir, mejor. Hey, es mejor que la discusión sin fin, y -) Por lo tanto:?

$ python -mtimeit -s'var=0; getvar=lambda:0' 'var = var or getvar()'
1000000 loops, best of 3: 0.359 usec per loop
$ python -mtimeit -s'var=0; getvar=lambda:0' 'if not var: var = getvar()'
1000000 loops, best of 3: 0.361 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'var = var or getvar()'
10000000 loops, best of 3: 0.123 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'if not var: var = getvar()'
10000000 loops, best of 3: 0.0899 usec per loop

la if lo tiene -. var equivalentes cuando es falsa, más rápido cuando está true

En realidad, si usted está tratando de determinar si var se ha establecido previamente mediante una llamada a get_var, entonces me gustaría afirmar que ambas formas están equivocados . Python trata a un número de valores perfectamente ordinarios como la evaluación de un valor booleano 'false': 0, Ninguna, [], (,), set (), y {}. Así que digamos var va a ser un número entero, y get_var () pasa a devolver 0. Ahora, sin importar cuál es el formulario que utilice, get_var () será llamado una y otra vez, a pesar de que ya sabemos que var es 0

Hay varios métodos para detectar si una variable se ha definido o no:

  • mirada en el dict devuelto por variables globales o locales () ()

  • envolver el var = var declaración en un bloque try / except, atrapando en NameError

  • utilizar un valor centinela como ninguna, e inicializar var a este valor; entonces se puede probar la if var is None: var = get_var() (usando 'es', no '=='). Si tienes la mala suerte, y ninguno es un valor potencial para ser de regresar de get_var (), entonces tendrá que definir su propio valor especial que aún no definido, usando algo como NOT_DEFINED = object(), inicializar var con ella, y luego se puede prueba para if var is NOT_DEFINED.

Para mí, el primer idioma, el uso de la explícita si, es preferible porque más explícita.

Sin embargo he visto el o construcción que se hace referencia como el preferido / más Pythonic.

Así que, por una parte, Explicit is better than implicit (Zen cita), por el contrario, la expresión corta puede ser visto como Pythonic (aunque más corta no es equivalente a Pythonic en todos los casos!)

A TAN cuestión estrechamente relacionada es forma más idiomática Ninguno de convertir a la cadena vacía , y tanto el caso y las expresiones idiomáticas o se aparece allí.

La primera versión es más intuitivo para mí. Pero, de nuevo, todo es cuestión de su propio gusto.

Segundo uno es más Pythonic, y normalmente uso que.

Ni es un error.

La primera es más claro de entender para alguien que lee el código.

Pregúntese si, cuando se está pensando sobre el problema que está tratando de resolver, los conceptos que vienen a la mente son más cerca de "si esto, entonces eso" o "una lógica OR de dos casi, pero no del todo, de Boole variables ".

Ambos finalmente compilar el mismo código, ya que o es un operador de cortocircuito (no evalúa el argumento de la derecha si la mano izquierda es cierto).

Yo prefiero el primero, ya que expresa su intención con mayor claridad. El segundo es probablemente más compacto.

El intérprete es probable que ejecutarlos tanto el camino. Hay ventajas y desventajas con respecto a la legibilidad del código. ¿Qué afirmación es más fácil reconocer lo que hace? Ciertamente, el primero es mucho más clara. Para mí, la lectura de este post, he tenido que pensar más en el segundo. Yo uso la primera debido a la mayor facilidad de lectura, incluso si la segunda afirmación es un poco 'más sexy'.

Espero que esto ayude.
-tjw

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top