Bonjour,

J'essaye de rajouter dynamiquement un argument à une fonction de manière efficace (j'aurais pu wrapper ma fonction par une autre, ou assigner dans func_globals pour émuler le même comportement, mais c'est plus long)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
def add_arg(f,name,dvalue):
    """ Ajoute l'argument f(...,name=dvalue,*a,**k) à f """
    cod= f.func_code    
    # les variables locales, arguments et **/*arguments
    varnames= cod.co_varnames[:cod.co_argcount] + (name,) + cod.co_varnames[cod.co_argcount:]
    # nombre de vrais arguments (avec defaults, avant *a et *k)
    argcount= cod.co_argcount+1
    # les noms non référencés (len)
    names= tuple( (n for n in cod.co_names if not(n==name))) # on la retire
    # compte les varnames, pas les names
    nlocals= cod.co_nlocals+1
 
    print varnames,argcount,names #,n_locals
 
    y_code = types.CodeType(argcount,
        nlocals,
        cod.co_stacksize,
        cod.co_flags,
        cod.co_code,
        cod.co_consts,
        names,
        varnames,
        cod.co_filename,
        cod.co_name,
        cod.co_firstlineno,
        cod.co_lnotab)    
 
    dynf = types.FunctionType(y_code, f.func_globals)
    dynf.func_defaults= f.func_defaults+ (dvalue,)
 
    return dynf
 
def DEMOadd():
    def f(arg0,arg1=1,*argtup,**argdict):
        print unnamed
        len([])
        localv1= unnamed+arg0        
        return localv1
    dynf= add_arg(f,'unnamed',1)
    # printfun(dynf)
    print dynf(1,2,3)
Evidement, ca ne marche pas (l'application crashe sans message de la part de Python). Assigner le y_code à f plutôt qu'à une copie dynf ne marche pas non plus.

Quand je regarde ce code (faisant en outre la même chose) : http://code.activestate.com/recipes/...-compile-time/, je réalise que c'est plus compliqué et qu'il faut toucher à l'attribut co_code.

Brièvement, pourquoi est_ce nécessaire ? Ou puis je trouver la doc permettant de comprendre le code sur le lien ci dessus ?

Merci d'avance