Skip to content

Commit d859cd6

Browse files
authored
Move *args init from ApiMessage to DataContainer (#2737)
1 parent 73941d8 commit d859cd6

2 files changed

Lines changed: 13 additions & 10 deletions

File tree

kafka/protocol/new/api_message.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,8 @@ def __init_subclass__(cls, **kw):
8686

8787
def __init__(self, *args, **kwargs):
8888
self._header = None
89-
self._version = None
90-
if 'version' in kwargs:
91-
self.API_VERSION = kwargs['version']
92-
if len(args) > 0:
93-
untagged_fields = self._struct.untagged_fields(self.API_VERSION)
94-
if len(args) != len(untagged_fields):
95-
raise RuntimeError('Unable to init ApiMessage via positional args: unexpected len')
96-
kwargs.update({field.name: args[i] for i, field in enumerate(untagged_fields)})
97-
args = ()
89+
if 'version' not in kwargs:
90+
kwargs['version'] = self._class_version # pylint: disable=E1101
9891
super().__init__(*args, **kwargs)
9992

10093
@classproperty

kafka/protocol/new/data_container.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,19 @@ def __init_subclass__(cls, **kwargs):
2222
field.set_data_class(type(field.type_str, (DataContainer,), {'_struct': field}))
2323
setattr(cls, field.type_str, field.data_class)
2424

25-
def __init__(self, version=None, **field_vals):
25+
def __init__(self, *args, version=None, **field_vals):
2626
assert self._struct is not None
2727
self._version = version
28+
# Support positional arg init for convenience
29+
if len(args) > 0:
30+
if self._version is not None:
31+
field_args = [field for field in self._struct._fields if field.for_version_q(self._version)]
32+
else:
33+
field_args = self._struct._fields
34+
if len(args) > len(field_args):
35+
raise RuntimeError('Unable to init DataContainer with %d positional args: unexpected %d' % (len(args), len(field_args)))
36+
field_vals.update({field_args[i].name: arg for i, arg in enumerate(args)})
37+
args = ()
2838
self.tags = None
2939
self.unknown_tags = None
3040
for field in self._struct._fields:

0 commit comments

Comments
 (0)