tablas - ¿Qué sucede si escribes un nombre de variable solo en python?
django tutorial español pdf (5)
La declaración foo
es un ejemplo de declaración de expresión , por lo que se evalúa cuando el intérprete lo encuentra.
Una declaración de expresión evalúa la lista de expresiones (que puede ser una sola expresión).
Así que foo
se carga, la expresión se evalúa (que es foo
sí misma, por lo que no se necesitan más acciones) y el resultado se olvida de inmediato.
Recientemente sentí curiosidad por lo que sucedió en la línea 2 del siguiente código falso de python:
def my_fun(foo,bar):
foo
return foo + bar
La razón por la que me interesé es que estoy probando Light Table e intenté poner un reloj en "foo". Parecía hacer que el intérprete de Python se bloqueara.
¿Tengo razón al pensar que esta línea no tiene absolutamente ningún efecto y no causa ningún tipo de error? ¿Puede alguien explicar qué hace exactamente el intérprete aquí?
No pasa nada. Se convierte en equivalente a una operación sin sentido Mirando la salida dis
In [3]: dis.dis(my_fun)
2 0 LOAD_FAST 0 (foo)
3 POP_TOP
3 4 LOAD_FAST 0 (foo)
7 LOAD_FAST 1 (bar)
10 BINARY_ADD
11 RETURN_VALUE
Podemos ver que hace la carga rápida para foo
luego no hace nada con ella.
No pasa nada:
>>> def baz(foo, bar):
foo
return bar
>>> baz(10, 20)
20
La declaración no tiene efecto.
Pruébelo en la línea de comando: solo devuelve el valor en foo
. Esto no significa que no pueda tener efectos secundarios en algunos casos especiales: si hace algo como:
def my_fun(foo, bar):
foo.prop
return foo.func(bar)
aunque técnicamente acabamos de devolver el valor, si está definido como una propiedad, entonces foo.prop
puede llamar a una función.
Pero normalmente ... no lo harías en módulos, solo en una consola interactiva.
Uno puede ver lo que está sucediendo con un poco de ayuda desde el módulo dis integrado:
import dis
def my_fun(foo,bar):
foo
return foo + bar
dis.dis(my_fun)
La función dis.dis
desmonta funciones (sí, puede desmontarse a sí misma), métodos y clases.
La salida de dis.dis(my_fun)
es:
4 0 LOAD_FAST 0 (foo)
3 POP_TOP
5 4 LOAD_FAST 0 (foo)
7 LOAD_FAST 1 (bar)
10 BINARY_ADD
11 RETURN_VALUE
Los dos primeros bytecodes son exactamente lo que necesitamos: la línea foo
.
Esto es lo que hacen estos códigos de código:
- El primero inserta una referencia a una variable local
foo
en la pila ( LOAD_FAST ) - El segundo elimina la parte superior de la pila ( POP_TOP )
Básicamente, la línea foo
no tiene efecto. (bueno, si la variable foo
no está definida, LOAD_FAST
lanzará el NameError
)