@Rohit , nous ne comprenons pas ce que vous voulez dire quand vous dites "la déclaration de fonction". Si vous voulez dire que vous ne voulez pas changer l'API de la fonction (la manière documentée la fonction est appelée), peut-être parce que vous avez le code existant appelant déjà une fonction existante, vous pouvez toujours utiliser la notation **kwargs
, et les appelants seront ne sait jamais:
def foo(a, b, c):
return a + b + c
def foo(**kwargs):
total = 0
for x in ("a", "b", "c"):
assert x in kwargs
total += kwargs[x]
return total
def bar():
foo(3, 5, 7)
bar()
ne peut pas dire quelle version de foo()
il appelle, et ne se soucie pas.
Peut-être que vous cherchez un « emballage », vous pouvez enrouler autour des objets fonctionnels existants, sans modifier le code source de l'objet de la fonction?
def make_wrapper(fn, *arg_names):
def wrapped_fn(*args):
mydict = dict(tup for tup in zip(arg_names, args))
print("TEST: mydict: %s" % str(mydict))
return fn(*args)
return wrapped_fn
def foo(a, b, c):
return a + b + c
foo = make_wrapper(foo, "a", "b", "c")
foo(3, 5, 7)
La nouvelle fonction enveloppé rassemble les arguments en mydict
et imprime mydict
avant d'appeler la fonction.
Impossible une copie des 'locals()' dict résoudre le problème, à savoir 'mondict = locals(). Copy()'? Au moins le problème de ne pas modifier 'mydict'? – ndim
@ndim, oui, cela fonctionnerait bien pour éviter le problème de la modification des locaux(). Nous ne pouvons pas savoir si cela aiderait le PO, compte tenu du peu qu'il a donné jusqu'ici. –
>>> >>> def toto (a, b, c): ... mydict = locals() ... mydict ['a'] = 0 ...print mondict ... imprimer un ... >>> >>> foo (1,2,3) { 'a': 0, 'c': 3, 'b': 2} >>> ressemble à je viens de modifier mydict .. et il n'a pas jeté d'erreurs !! – Nullpoet