Recientemente he estado haciendo cosas como esta:estilo de código - 'esconde' funciones dentro de otras funciones
import Tkinter
class C(object):
def __init__(self):
self.root = Tkinter.Tk()
def f():
print 'hello'
self.button = Tkinter.Button(master=self.root, command=f, text='say hello')
en contraposición a algo como esto:
import Tkinter
class C(object):
def __init__(self):
self.root = Tkinter.Tk()
self.button = Tkinter.Button(master=self.root, command=self.f, text='say hello')
def f(self):
print 'hello'
La cuestión no es específica a Tkinter, pero es un buen ejemplo. La función f
solo se utiliza como devolución de llamada para el botón, por lo que he decidido definirla dentro de __init__
. De esta forma, solo el código dentro de __init__
sabe incluso sobre la existencia de f
: los ámbitos externos no se saturan de nombres, y el usuario no necesita preocuparse por una carga de métodos diseñados para ser internos.
Mi pregunta es: ¿se considera esto como un buen estilo? Me preocupa porque tengo una clase de GUI con un montón de botones: __init__
está empezando a parecer muy larga, con muchas definiciones de funciones locales. ¿Hay alguna alternativa más apropiada que debería usar?
Tienes razón, por supuesto, pero en la versión del mundo real de mi ejemplo, 'f' está haciendo algo más que 'imprimir' hola''. No cabe dentro de una función lambda. –
@poorsod: si no está utilizando la instancia, entonces no debería ser un método. Puede convertirlo en una función de nivel de módulo, o puede seguir haciéndolo tal como está ahora, pero no usaría un método (o incluso un método estático) si no necesita la instancia en la función. – mgilson
@mgilson: Creo que se pierde el sentido de la pregunta, que si las devoluciones de llamada deberían ser funciones no locales. La razón por la que ves lambda con tanta frecuencia en las devoluciones de llamada de Tkinter es unir los argumentos locales a la devolución de llamada. La devolución de llamada a menudo se define en otro lugar. –