@havelock Да, это то, что он говорил. Используйте x.get вместо x ['a'].
равится, как красиво выглядит / чувствует питон, и я надеюсь, что это может быть чище (удобочитаемость потрясающая).
Как правильно принять необязательный аргумент ключевого слова при переопределении подклассав этом где опциональноkwarg
должен быть использованпосле super()
вызов?
У меня есть форма django, где я хотел бы принять необязательный пользовательский аргумент, но если я определю его как один из аргументовuser=None
тогда обычная форма вызоваform({})
предполагает, что позиционный аргумент относится к ключевому аргументуuser
.
Код говорит лучше, чем (мои) слова:
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)
Я могу сделать это самым чистым, глядя на фактическоеForm
класс, чтобы увидеть, какие аргументы он ищет, но одна из величайших вещей о создании подклассов в Python - это собрать всеargs
а такжеkwargs
и передать его в то, что вы подклассом. Также это не распространяется на любые изменения в источнике.
def __init__(self, querydict=None, user=None):
super(BaseCheckoutForm, self).__init__(querydict)
if user:
self.prefill_from_user(user)
Но, к сожалению, у меня есть:
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)
Спасибо за любой вклад!