Ich liebe es, wie schön Python aussieht und sich anfühlt, und ich hoffe, dass dies sauberer sein kann (Lesbarkeit ist großartig).
Was ist ein sauberer Weg, um ein optionales Schlüsselwort-Argument zu akzeptieren, wenn eine untergeordnete Klasse überschrieben wird init wobei die optionale kwarg
muss verwendet werden après el super()
anrufen?
Ich habe ein Django-Formular, wo ich ein optionales Benutzerargument akzeptieren möchte, aber wenn ich es als eines der Argumente definieren user=None
dann der übliche Formularaufruf form({})
geht davon aus, dass sich das Positionsargument auf das Schlüsselwortargument bezieht user
.
Code spricht besser als (meine) Worte:
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)
Ich kann das am saubersten machen, indem ich in den eigentlichen Form
Klasse, um zu sehen, nach welchen Argumenten sie sucht, aber eines der großartigsten Dinge beim Unterklassifizieren von irgendetwas in Python ist das Sammeln aller args
y kwargs
und übergibt es an das, was Sie unterklassifiziert haben. Auch dies gilt nicht für Änderungen in der Quelle.
def __init__(self, querydict=None, user=None):
super(BaseCheckoutForm, self).__init__(querydict)
if user:
self.prefill_from_user(user)
Aber leider habe ich das:
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)
Danke für jeden Beitrag!