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