From 1b2ef84d480aeea9b58969d868c6e16abb1985a1 Mon Sep 17 00:00:00 2001 From: Eric Fitzgerald Date: Mon, 29 Dec 2025 00:54:28 -0500 Subject: [PATCH] [Python] Fix allOf inheritance by using **kwargs throughout inheritance chain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a child model extends a parent via allOf, the generated __init__ method was consuming parameters from kwargs, preventing them from reaching parent classes. This caused deserialization failures. The fix changes how inheritance is handled: 1. Child classes (with parent) now use **kwargs for all parameters: - Extract values with kwargs.get('name') - Pass the full **kwargs to parent (nothing consumed/removed) 2. Root classes (without parent) now accept **kwargs: - Keep named parameters for clean API - Add **kwargs to absorb extra parameters from child classes Before (broken): ```python class Child(Parent): def __init__(self, name=None, type=None, child_only=None, *args, **kwargs): self.name = name # consumed from kwargs self.type = type # consumed from kwargs Parent.__init__(self, *args, **kwargs) # name, type NOT passed! ``` After (fixed): ```python class Child(Parent): def __init__(self, **kwargs): name = kwargs.get('name') type = kwargs.get('type') child_only = kwargs.get('child_only') self.name = name self.type = type Parent.__init__(self, **kwargs) # full kwargs passed! class Parent: def __init__(self, name=None, type=None, **kwargs): # accepts extra kwargs self.name = name self.type = type ``` This ensures kwargs flows through the entire inheritance chain. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../handlebars/python/model.mustache | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/resources/handlebars/python/model.mustache b/src/main/resources/handlebars/python/model.mustache index 5ef0d319f9..bf8db21a5c 100644 --- a/src/main/resources/handlebars/python/model.mustache +++ b/src/main/resources/handlebars/python/model.mustache @@ -67,7 +67,29 @@ class {{classname}}({{#parent}}{{parent}}{{/parent}}{{^parent}}object{{/parent}} } {{/discriminator}} - def __init__(self{{#vars}}, {{name}}={{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{/vars}}{{#parent}}, *args, **kwargs{{/parent}}): # noqa: E501 +{{#parent}} + def __init__(self, **kwargs): # noqa: E501 + """{{classname}} - a model defined in Swagger""" # noqa: E501 +{{#vars}}{{#@first}} +{{/@first}} + self._{{name}} = None +{{/vars}} + self.discriminator = {{#discriminator}}'{{discriminator.propertyName}}'{{/discriminator}}{{^discriminator}}None{{/discriminator}} +{{#vars}}{{#@first}} +{{/@first}} + {{name}} = kwargs.get('{{name}}'{{#defaultValue}}, {{{defaultValue}}}{{/defaultValue}}) +{{#required}} + self.{{name}} = {{name}} +{{/required}} +{{^required}} + if {{name}} is not None: + self.{{name}} = {{name}} +{{/required}} +{{/vars}} + {{parent}}.__init__(self, **kwargs) +{{/parent}} +{{^parent}} + def __init__(self{{#vars}}, {{name}}={{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{/vars}}, **kwargs): # noqa: E501 """{{classname}} - a model defined in Swagger""" # noqa: E501 {{#vars}}{{#@first}} {{/@first}} @@ -84,8 +106,6 @@ class {{classname}}({{#parent}}{{parent}}{{/parent}}{{^parent}}object{{/parent}} self.{{name}} = {{name}} {{/required}} {{/vars}} -{{#parent}} - {{parent}}.__init__(self, *args, **kwargs) {{/parent}} {{#vars}}