1
0
mirror of https://github.com/django/django.git synced 2025-06-05 19:49:13 +00:00

Fixed #36383 -- Improved migration serialization for functools.partial objects.

This commit is contained in:
Adam Johnson 2025-05-11 23:08:38 +02:00 committed by nessita
parent 57fdc104d2
commit 6e36f7f784
2 changed files with 11 additions and 23 deletions

View File

@ -207,23 +207,11 @@ class FunctionTypeSerializer(BaseSerializer):
class FunctoolsPartialSerializer(BaseSerializer): class FunctoolsPartialSerializer(BaseSerializer):
def serialize(self): def serialize(self):
# Serialize functools.partial() arguments partial_name = self.value.__class__.__name__
func_string, func_imports = serializer_factory(self.value.func).serialize() return DeconstructibleSerializer.serialize_deconstructed(
args_string, args_imports = serializer_factory(self.value.args).serialize() f"functools.{partial_name}",
keywords_string, keywords_imports = serializer_factory( (self.value.func, *self.value.args),
self.value.keywords self.value.keywords,
).serialize()
# Add any imports needed by arguments
imports = {"import functools", *func_imports, *args_imports, *keywords_imports}
return (
"functools.%s(%s, *%s, **%s)"
% (
self.value.__class__.__name__,
func_string,
args_string,
keywords_string,
),
imports,
) )

View File

@ -911,7 +911,7 @@ class WriterTests(SimpleTestCase):
string, imports = MigrationWriter.serialize(value) string, imports = MigrationWriter.serialize(value)
self.assertSerializedFunctoolsPartialEqual( self.assertSerializedFunctoolsPartialEqual(
value, value,
"functools.partial(datetime.timedelta, *(), **{})", "functools.partial(datetime.timedelta)",
{"import datetime", "import functools"}, {"import datetime", "import functools"},
) )
@ -920,7 +920,7 @@ class WriterTests(SimpleTestCase):
string, imports = MigrationWriter.serialize(value) string, imports = MigrationWriter.serialize(value)
self.assertSerializedFunctoolsPartialEqual( self.assertSerializedFunctoolsPartialEqual(
value, value,
"functools.partial(datetime.timedelta, *(1,), **{})", "functools.partial(datetime.timedelta, 1)",
{"import datetime", "import functools"}, {"import datetime", "import functools"},
) )
@ -929,7 +929,7 @@ class WriterTests(SimpleTestCase):
string, imports = MigrationWriter.serialize(value) string, imports = MigrationWriter.serialize(value)
self.assertSerializedFunctoolsPartialEqual( self.assertSerializedFunctoolsPartialEqual(
value, value,
"functools.partial(datetime.timedelta, *(), **{'seconds': 2})", "functools.partial(datetime.timedelta, seconds=2)",
{"import datetime", "import functools"}, {"import datetime", "import functools"},
) )
@ -938,7 +938,7 @@ class WriterTests(SimpleTestCase):
string, imports = MigrationWriter.serialize(value) string, imports = MigrationWriter.serialize(value)
self.assertSerializedFunctoolsPartialEqual( self.assertSerializedFunctoolsPartialEqual(
value, value,
"functools.partial(datetime.timedelta, *(1,), **{'seconds': 2})", "functools.partial(datetime.timedelta, 1, seconds=2)",
{"import datetime", "import functools"}, {"import datetime", "import functools"},
) )
@ -947,7 +947,7 @@ class WriterTests(SimpleTestCase):
string, imports = MigrationWriter.serialize(value) string, imports = MigrationWriter.serialize(value)
self.assertSerializedFunctoolsPartialEqual( self.assertSerializedFunctoolsPartialEqual(
value, value,
"functools.partial(datetime.timedelta, *(), **{'kebab-case': 1})", "functools.partial(datetime.timedelta, **{'kebab-case': 1})",
{"import datetime", "import functools"}, {"import datetime", "import functools"},
) )
@ -956,7 +956,7 @@ class WriterTests(SimpleTestCase):
string, imports = MigrationWriter.serialize(value) string, imports = MigrationWriter.serialize(value)
result = self.assertSerializedFunctoolsPartialEqual( result = self.assertSerializedFunctoolsPartialEqual(
value, value,
"functools.partialmethod(datetime.timedelta, *(1,), **{'seconds': 2})", "functools.partialmethod(datetime.timedelta, 1, seconds=2)",
{"import datetime", "import functools"}, {"import datetime", "import functools"},
) )
self.assertIsInstance(result, functools.partialmethod) self.assertIsInstance(result, functools.partialmethod)