[Python-es] Variables definidas despues

Chema Cortes chemacortes en wanadoo.es
Vie Jul 12 11:40:23 CEST 2002


Attila escribió:

> os queria preguntar una duda, si en el script que yo hago, que es un motor de acciones a realizar,
> defino dichas acciones a realizar y como si las metiera en una lista, para luego cuando yo diga,
> ejecutar esas acciones, no cuando las defino. Mi duda es saber, que si yo voy definiendo esas
> acciones a realizar y alguno de los parametros es una variable que definire despues, que pasa?
> sera capaz de recoger esa variable definida despues o tendre que obligatoriamente definirla
> despues?
> 
> porque al fin y al cabo, la ejecucion real de la accion real sera despues de mi definicion de
> dicha variable.

Aunque creo que sé por donde va tu pregunta, no tengo cuál es tu duda.

Tu pregunta trata de lo que se llama "evaluación tardía" de variables. El problema es que siempre que emplees una variable en un lugar, siempre leerás su valor en ese momento. Para retrasar su evaluación tendríamos que hablar de otra cosa.

Una solución muy simple es utilizar la función 'eval' para implementar "macros":

myfunc="copy(predicate, .....)"
SetPredicate(....)
valor=eval(myfunc)

Otra solución más optima sería con funciones lambda:

myfunc=lambda: copy(predicate,....)
SetPredicate(....)
valor=myfunc()


De todos modos no es muy recomendable usar este estilo de programación. Si necesitas evaluación tardía, emplea funciones u objetos. Con objetos puedes implementar accesores a datos que evalúen el valor "actual" del objeto:

import time
class T:
  def __getattr__(self,name):
    if name=="value":
      return time.clock()
    else:
      raise AttributeError

>>> a=T()
>>> a.value
94.924456679619865
>>> a.value
156.02256952845005

Ahora bien, estoy casi convencido que no te tiene que hacer falta evaluación tardía (no sé cómo es tu código). Puede que sea suficiente una separación entre la función y sus argumentos:

F={"Copiar":copy, "Mover":move, "Borrar": delete}
args={"from":"/home/chema/pepe.txt","to":/home/chema/pepa.txt"}
F["Copiar"](**args)


Saludos,
Chema Cortés
chemacortes en wanadoo.es
_____________________________________________________________________
No olvides nada. Recuerda los cumpleaños, tus citas, tus cenas románticas y 
todo lo que quieras usando la Agenda personal de Wanadoo.es, desde cualquier 
lugar conectado a Internet. Visítala en http://www.wanadoo.es/agenda






Más información sobre la lista de distribución Python-es