Une fonction est simplement un objet que l'on peut appeler ainsi définir une classe avec une méthode __call__
équivaut en principe à définir une fonction. Au moins dans le contexte que vous donnez.
Alors:
def user_func(x, y, z):
return anything_with(x, y, z)
équivaut à:
class user_class(object):
@staticmethod # staticmethod so that it can be called on the class
def __call__(x, y, z):
return anything_with(x, y, z)
tel qu'il se présente est tout simplement faux-fuyants. Mais la magie se produit lorsque vous créez une instance avec des attributs prédéfinis et vous ne spécifions les arguments variables en tant que paramètres pour la call
:
class user_class(object):
def __init__(self, x):
self.x = x
def __call__(self, y, z): # No x as parameter!
return do_anything_with(self.x, y, z) # use the predefined x here
mais vous devez modifier la façon dont vous appelez lib_func
alors:
x = 0
user_class_instance = user_class(0)
result = lib_func(user_class_instance, param1)
il répétera appeler l'instance avec différents y
et z
mais x
sera maintenue constante
La plupart de ces paramètres variables fonctions permettent cependant lib_func
passer (par exemple qui sera donné au user_func
), par exemple scipy.optimize.curve_fit
:
curve_fit(user_func, x, y, [initial_guess_param1, param2, ...])
il user_func
sera appelé par curve_fit
interne (vous n'avez pas faire quoi que ce soit) comme:
user_func(x, initial_guess_param1, param2, ...)
# Then curve-fit modifies initial_guess_param1, param2, ... and calls it again
user_func(x, initial_guess_param1, param2, ...)
# and again modifies these and calls again
user_func(x, initial_guess_param1, param2, ...)
# ... until it finds a solution
il x
et y
sont définis et pas changé lors de l'appel, mais curve_fit
initial_guess_param1
sera changé tout en trouvant le curve_fit
optimal.
Vous ne pouvez pas modifier user_func() aussi, non? –
oui vous pouvez modifier user_func –
Si vous pouvez modifier user_func, quel est le problème? Arrêtez simplement d'utiliser des variables globales! –