2010-09-10 26 views
13

que tienen funciones como este:Python definir funciones dinámicas

def activate_field_1(): 
    print 1 

def activate_field_2(): 
    print 2 

def activate_field_3(): 
    print 3 

¿Cómo defino activate_field_[x] para x=1:10, sin tener que escribir a cabo cada uno de ellos? Prefiero pasar un parámetro, por supuesto, pero para mis propósitos esto no es posible.

Gracias!

+0

que usted dice en una comente que quiere definirlos estáticamente, pero luego menciona que hacerlo desperdiciará espacio en el archivo fuente. ¿Cuál es? – aaronasterling

+0

¿Qué es una "función dinámica"? ¿Puedes explicar el significado pretendido de esta frase? –

+0

Esta pregunta parece ser un duplicado: http://stackoverflow.com/questions/11291242/python-dynamically-create-function-at-runtime –

Respuesta

17

¿Desea definirlos individualmente en su archivo fuente, estáticamente? Entonces, tu mejor opción sería escribir un script para generarlos.

Si, por el contrario, desea estas funciones en tiempo de ejecución, puede utilizar una función de orden superior. Por ej.

>>> def make_func(value_to_print): 
...  def _function(): 
...   print value_to_print 
...  return _function 
... 
>>> f1 = make_func(1) 
>>> f1() 
1 
>>> f2 = make_func(2) 
>>> f2() 
2 

Puede generar una lista de estos y tienda, de nuevo en tiempo de ejecución.

>>> my_functions = [make_func(i) for i in range(1, 11)] 
>>> for each in my_functions: 
...  each() 
... 
1 
2 
3 
... 
+0

Sí, quería definirlos estáticamente en el archivo fuente. Puedo guiarlos, aunque tantas funciones desperdician espacio. Gracias por la explicación sobre cómo hacerlo en tiempo de ejecución. – ash

3

Es posible poner nuevos símbolos en el diccionario de asociaciones de variables actuales devuelto por vars():

for i in range(1, 11): 
    def f(x): 
     def g(): 
      print x 
     return g 
    vars()['activate_field_%d' % i] = f(i) 

>>> activate_field_3() 
3 

Pero este truco no es generalmente recommented a menos que definitivamente seguro de que lo necesite.

3

Quizás pueda adaptar esta receta a sus necesidades.

from functools import partial 
class FunctionPool: 
    def __init__(self,function): 
     self.function = function 
    def __getitem__(self,item): 
     return partial(self.function,item) 

>>> @FunctionPool 
def func(item,param): 
    print "function#{item} called with {param}".format(
     item = item, 
     param = param) 
>>> f = func[2] 
>>> f(3) 
function#2 called with 3 
7

Aquí hay algo que produce nombres de función exactamente como usted quería (y es un poco más sencillo que el Dynamic/runtime method creation 's accepted answer mencionado en @ Goutham Ahora se suprime la respuesta):

func_template = """def activate_field_%d(): print(%d)""" 
for x in range(1, 11): exec(func_template % (x, x)) 

>>> activate_field_1() 
1 
>>> activate_field_7() 
7 
+0

Exactamente lo que necesitaba para generar dinámicamente funciones de casos de prueba para la prueba unitaria, gracias. – tilper

Cuestiones relacionadas