2010-09-10 10 views
13

I ont des fonctions comme celle-ci:Python définir des fonctions dynamiques

def activate_field_1(): 
    print 1 

def activate_field_2(): 
    print 2 

def activate_field_3(): 
    print 3 

Comment définir activate_field_[x] pour x=1:10, sans taper chacun d'eux? Je préférerais de loin passer un paramètre, mais pour moi, ce n'est pas possible.

Merci!

+0

Vous dites dans un commentez que vous voulez les définir statiquement, mais vous mentionnez que cela va gaspiller de l'espace dans le fichier source. Lequel est-ce? – aaronasterling

+0

Qu'est-ce qu'une «fonction dynamique»? Pouvez-vous expliquer le sens voulu de cette phrase? –

+0

Cette question semble être un doublon: http://stackoverflow.com/questions/11291242/python-dynamically-create-function-at-runtime –

Répondre

17

Voulez-vous les définir individuellement dans votre fichier source, de manière statique? Alors votre meilleure option serait d'écrire un script pour les générer.

Si d'un autre côté vous voulez ces fonctions lors de l'exécution, vous pouvez utiliser une fonction d'ordre supérieur. Par exemple

>>> 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 

Vous pouvez générer une liste de ceux-ci et les stocker, à nouveau lors de l'exécution.

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

Oui, je voulais les définir statiquement dans le fichier source. Je peux les écrire, bien que de nombreuses fonctions gaspillent de l'espace. Merci pour l'explication sur la façon de le faire à l'exécution. – ash

3

Vous pouvez mettre de nouveaux symboles dans le dictionnaire des liaisons de variables en cours retourné par 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 

Mais cette astuce est généralement pas à moins que vous recommented certainement que vous en avez besoin.

3

Peut-être pourriez-vous adapter cette recette à vos besoins.

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

Voici quelque chose que vous produit des noms de fonction exactement comme voulu (et est un peu plus simple que est maintenant réponse supprimé le mentionné dans l » accepted answerDynamic/runtime method creation @ Goutham):

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

Exactement ce dont j'avais besoin pour générer dynamiquement des fonctions de test pour les tests unitaires, merci. – tilper

Questions connexes