__call__ vs. def

02/12/2009 - 16:29 von Ole Streicher | Report spam
Hallo,

mir ist nicht ganz klar, in welchen Situationen man eine Funktion ab
besten per "def" und wann man sie als eigenes Objekt baut.

Konkretes Beispiel: Ich möchte eine Funktion als Rückgabewert haben, die
von einem Parameter abhàngt. Der Parameter soll Attribut der Funktion sein.

def get_func_as_def(par):
def my_func(x, par = par):
return some_operation(par, x)
my_func.par = par
return my_func

def my_func_as_class(par):
class my_func(object):
def __init__(self, par):
self.par = par
def __call__(self, x):
return some_operation(self.par, x)
return my_func(par)

Das erste sieht für mich kürzer aus, allerdings macht "my_func.par = par"
den Eindruck eines Hacks. Außerdem bringt

f = my_func_as_def(par)
...
f.par = other_par
f(x)

das unverànderte Ergebnis, was zumindest verwirrend sein kann. Die
zweite Variante sieht dagegen von vornhereit recht komplex aus,
insbesondere wenn man sie nochmal schachteln muss.

Hintergrund: ich möchte für einen Detektor eine kleine Simulation
schreiben. Dabei wàre meine Idee von der Aufrufhierarchie

detector_impl = Detector(detector_params)
response_func = detector_impl(environmental_conditions)
response = response_func(input_data)

d.h. der Detektor muss je nach Umgebungsbedingungen eine Funktion
liefern, die mir für einen konkreten Input einen Output liefert.

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Thomas Guettler
02/12/2009 - 16:42 | Warnen spam
Hallo,


Ole Streicher wrote:
Hallo,

mir ist nicht ganz klar, in welchen Situationen man eine Funktion ab
besten per "def" und wann man sie als eigenes Objekt baut.
...
detector_impl = Detector(detector_params)
response_func = detector_impl(environmental_conditions)
response = response_func(input_data)



was spricht gegen diese Lösungen, bei denen du ohne auskommst:

detector_impl = Detector(detector_params, environmental_conditions)
response = detector_impl.response_func(input_data)

oder

detector_impl = Detector(detector_params)
response = detector_impl.response_func(input_data, environmental_conditions)

Gruß,
Thomas

Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de

Ähnliche fragen