From b68772aab5447413a61ed1646d840d16b3f1447b Mon Sep 17 00:00:00 2001 From: Lonami Date: Sun, 25 Sep 2016 10:50:48 +0200 Subject: [PATCH] Fixed JSON encoding and decoding for lists, added empty() method The new empty() method retrieves an empty instance of the given object, with all the attributes set to None --- telethon/utils/binary_reader.py | 10 ++-------- telethon_generator/tl_generator.py | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/telethon/utils/binary_reader.py b/telethon/utils/binary_reader.py index 50fd2359..ff9a884d 100755 --- a/telethon/utils/binary_reader.py +++ b/telethon/utils/binary_reader.py @@ -117,14 +117,8 @@ class BinaryReader: # If there was still no luck, give up raise TypeNotFoundError(constructor_id) - # Now we need to determine the number of parameters of the class, so we can - # instantiate it with all of them set to None, and still, no need to write - # the default =None in all the classes, thus forcing the user to provide a real value - sig = inspect.signature(clazz.__init__) - params = [None] * (len(sig.parameters) - 1) # Subtract 1 (self) - result = clazz(*params) # https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists - - # Finally, read the object and return the result + # Create an empty instance of the class, and read its values + result = clazz.empty() result.on_response(self) return result diff --git a/telethon_generator/tl_generator.py b/telethon_generator/tl_generator.py index 62f331cd..71061875 100755 --- a/telethon_generator/tl_generator.py +++ b/telethon_generator/tl_generator.py @@ -133,6 +133,17 @@ class TLGenerator: TLGenerator.write_onsend_code(builder, arg, tlobject.args) builder.end_block() + # Generate the empty() function, which returns an "empty" + # instance, in which all attributes are set to None + builder.writeln('@staticmethod') + builder.writeln('def empty():') + builder.writeln('"""Returns an "empty" instance (all attributes are None)"""') + builder.writeln('return {}({})'.format( + TLGenerator.get_class_name(tlobject), + ', '.join('None' for _ in range(len(args))) + )) + builder.end_block() + # Write the on_response(self, reader) function builder.writeln('def on_response(self, reader):') # Do not read constructor's ID, since that's already been read somewhere else @@ -163,7 +174,11 @@ class TLGenerator: for arg in args: if TLGenerator.is_tlobject(arg.type): - builder.writeln("'{0}': self.{0}.json_encode(),".format(arg.name)) + if arg.is_vector: + builder.writeln("'{0}': [{0}_item.json_encode() " + "for {0}_item in self.{0}],".format(arg.name)) + else: + builder.writeln("'{0}': self.{0}.json_encode(),".format(arg.name)) else: builder.writeln("'{0}': self.{0},".format(arg.name)) @@ -175,16 +190,17 @@ class TLGenerator: builder.writeln('@staticmethod') builder.writeln('def json_decode(json_string):') builder.writeln('# Create an empty instance which will be filled with the JSON values') - builder.writeln('instance = {}({})'.format( - TLGenerator.get_class_name(tlobject), - ', '.join('None' for _ in range(len(args))) - )) + builder.writeln('instance = {}.empty()'.format(TLGenerator.get_class_name(tlobject))) builder.writeln('dictionary = json.loads(json_string)') builder.writeln() for arg in args: if TLGenerator.is_tlobject(arg.type): - builder.writeln("instance.{0} = dictionary['{0}'].json_decode() if '{0}' in dictionary " - "and dictionary['{0}'] is not None else None".format(arg.name)) + if arg.is_vector: + builder.writeln("instance.{0} = [{0}_item.json_decode() " + "for {0}_item in dictionary['{0}']]".format(arg.name)) + else: + builder.writeln("instance.{0} = dictionary['{0}'].json_decode() if '{0}' in dictionary " + "and dictionary['{0}'] is not None else None".format(arg.name)) else: builder.writeln("instance.{0} = dictionary.get('{0}', None)".format(arg.name))