tutorial tablas para leer funciones español datos python lighttable

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:

  1. El primero inserta una referencia a una variable local foo en la pila ( LOAD_FAST )
  2. 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 )