38 Stimmen

Python - Sauberste Weg zu überschreiben __init__ wo eine optionale kwarg muss nach dem super() Aufruf verwendet werden?

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!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X