descargar - Python: ¿la forma más limpia de anular__init__ donde se debe usar un kwarg opcional después de la llamada super()?
django windows (1)
Usualmente solo hago básicamente lo que estás haciendo aquí. Sin embargo, puede acortar / limpiar su código suministrando un argumento predeterminado a dict.pop
:
def __init__(self, *args, **kwargs):
user = kwargs.pop(''user'', None)
super(BaseCheckoutForm, self).__init__(*args, **kwargs)
if user is not None:
self.prefill_from_user(user)
Me encanta cuán hermosa se ve / se siente Python y espero que esto pueda ser más limpio (la legibilidad es impresionante).
¿Cuál es una forma limpia de aceptar un argumento de palabra clave opcional al reemplazar un init subclasificado donde el kwarg
opcional tiene que ser utilizado después de la llamada super()
?
Tengo un formulario django en el que me gustaría aceptar un argumento de usuario opcional, pero si lo defino como uno de los argumentos user=None
, entonces la forma de llamada de form({})
habitual form({})
asume que el argumento posicional se refiere al argumento de palabra clave user
.
El código habla mejor que (mis) palabras:
def __init__(self, *args, **kwargs):
user = None
if ''user'' in kwargs:
user = kwargs.pop(''user'')
super(BaseCheckoutForm, self).__init__(*args, **kwargs)
if user:
self.prefill_from_user(user)
Puedo hacer esto más limpio buscando en la clase de Form
real para ver qué argumentos está buscando, pero una de las mejores cosas acerca de la subclasificación de cualquier cosa en Python es recopilar todos los kwargs
y kwargs
y pasarlo a lo que haya subclasificado. Además, esto no resiste ningún cambio en la fuente.
def __init__(self, querydict=None, user=None):
super(BaseCheckoutForm, self).__init__(querydict)
if user:
self.prefill_from_user(user)
Pero desafortunadamente tengo:
def __init__(self, *args, **kwargs):
# cannot define user=None as an argument because normal usage
# of class expects a certain order of positional args
user = None
if ''user'' in kwargs:
# must pop now since super()__init__ isn''t expecting a user kwarg
user = kwargs.pop(''user'')
super(BaseCheckoutForm, self).__init__(*args, **kwargs)
if user:
self.prefill_from_user(user)
Gracias por cualquier entrada!