Как указывает @Keeper, вы не должны передавать свои «новые» аргументы ключевого слова суперклассу. Лучше всего, прежде чем звонить в Super's __init__
:
bqs = kwargs.pop('bases_queryset', None)
и после этого __init__
вызова отметьте if bqs is not None:
вместо has_key
(и, конечно, используйте bqs
вместо kwargs['bases_queryset']
).
Интересный альтернативный подход заключается в создании функции «селективного вызова» высшего порядка. Это немного беспорядок, если у вас есть как позиционные, так и именованные аргументы (это всегда немного запутано в метапрограмме ;-), поэтому для простоты изложения предположим, что функция, которую вы хотите выборочно вызывать, имеет только "нормальный" msgstr "именованные аргументы (т.е. не **k
). Сейчас:
import inspect
def selective_call(func, **kwargs):
names, _, _, _ = inspect.getargspec(func)
usable_kwargs = dict((k,kwargs[k]) for k in names if k in kwargs)
return func(**usable_kwargs)
с этим подходом, в вашем __init__
вместо прямого вызова супер 101 *, вы бы позвонили
selective_call(super_init, **kwargs)
и пусть эта функция более высокого порядка выполнит необходимую «обрезку». (Конечно, вам потребуется сделать его более беспорядочным для обработки как позиционных, так и именованных аргументов, ну, хорошо ...! -)