A volte mi ritrovo a voler eseguire lo stesso codice da punti diversi nella stessa funzione. Supponiamo di avere qualche funzione func1 e voglio fare la stessa cosa da alcuni punti diversi in func1. Normalmente il modo per farlo sarebbe scrivere un'altra funzione, chiamarla "func2", e chiamare func2 da diversi posti in func1. Ma che dire quando è conveniente avere le variabili di accesso func2 che sono locali a func1? Mi trovo a scrivere una chiusura. Ecco un esempio forzato:
import random
import string
def func1 (param1, param2):
def func2(foo, bar):
print "{0} {1} {2:0.2f} {3} {4} {0}".format('*'*a, b, c, foo, bar)
a = random.randrange(10)
b = ''.join(random.choice(string.letters) for i in xrange(10))
c = random.gauss(0, 1)
if param1:
func2(a*c, param1)
else:
if param2 > 0:
func2(param2, param2)
Questo è il modo Pythonico per gestire questo problema? Una chiusura sembra una macchina piuttosto pesante da far girare qui, soprattutto dato che devo costruire una nuova funzione ogni volta che viene chiamata func1, anche se quella funzione sarà fondamentalmente la stessa ogni volta. Ma evita il codice duplicato e in pratica l'overhead di creare ripetutamente func2 non ha importanza per me.