Skip to content

Commit 6e36f7f

Browse files
adamchainznessita
authored andcommitted
Fixed #36383 -- Improved migration serialization for functools.partial objects.
1 parent 57fdc10 commit 6e36f7f

File tree

2 files changed

+11
-23
lines changed

2 files changed

+11
-23
lines changed

django/db/migrations/serializer.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -207,23 +207,11 @@ def serialize(self):
207207

208208
class FunctoolsPartialSerializer(BaseSerializer):
209209
def serialize(self):
210-
# Serialize functools.partial() arguments
211-
func_string, func_imports = serializer_factory(self.value.func).serialize()
212-
args_string, args_imports = serializer_factory(self.value.args).serialize()
213-
keywords_string, keywords_imports = serializer_factory(
214-
self.value.keywords
215-
).serialize()
216-
# Add any imports needed by arguments
217-
imports = {"import functools", *func_imports, *args_imports, *keywords_imports}
218-
return (
219-
"functools.%s(%s, *%s, **%s)"
220-
% (
221-
self.value.__class__.__name__,
222-
func_string,
223-
args_string,
224-
keywords_string,
225-
),
226-
imports,
210+
partial_name = self.value.__class__.__name__
211+
return DeconstructibleSerializer.serialize_deconstructed(
212+
f"functools.{partial_name}",
213+
(self.value.func, *self.value.args),
214+
self.value.keywords,
227215
)
228216

229217

tests/migrations/test_writer.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,7 @@ def test_serialize_functools_partial(self):
911911
string, imports = MigrationWriter.serialize(value)
912912
self.assertSerializedFunctoolsPartialEqual(
913913
value,
914-
"functools.partial(datetime.timedelta, *(), **{})",
914+
"functools.partial(datetime.timedelta)",
915915
{"import datetime", "import functools"},
916916
)
917917

@@ -920,7 +920,7 @@ def test_serialize_functools_partial_posarg(self):
920920
string, imports = MigrationWriter.serialize(value)
921921
self.assertSerializedFunctoolsPartialEqual(
922922
value,
923-
"functools.partial(datetime.timedelta, *(1,), **{})",
923+
"functools.partial(datetime.timedelta, 1)",
924924
{"import datetime", "import functools"},
925925
)
926926

@@ -929,7 +929,7 @@ def test_serialize_functools_partial_kwarg(self):
929929
string, imports = MigrationWriter.serialize(value)
930930
self.assertSerializedFunctoolsPartialEqual(
931931
value,
932-
"functools.partial(datetime.timedelta, *(), **{'seconds': 2})",
932+
"functools.partial(datetime.timedelta, seconds=2)",
933933
{"import datetime", "import functools"},
934934
)
935935

@@ -938,7 +938,7 @@ def test_serialize_functools_partial_mixed(self):
938938
string, imports = MigrationWriter.serialize(value)
939939
self.assertSerializedFunctoolsPartialEqual(
940940
value,
941-
"functools.partial(datetime.timedelta, *(1,), **{'seconds': 2})",
941+
"functools.partial(datetime.timedelta, 1, seconds=2)",
942942
{"import datetime", "import functools"},
943943
)
944944

@@ -947,7 +947,7 @@ def test_serialize_functools_partial_non_identifier_keyword(self):
947947
string, imports = MigrationWriter.serialize(value)
948948
self.assertSerializedFunctoolsPartialEqual(
949949
value,
950-
"functools.partial(datetime.timedelta, *(), **{'kebab-case': 1})",
950+
"functools.partial(datetime.timedelta, **{'kebab-case': 1})",
951951
{"import datetime", "import functools"},
952952
)
953953

@@ -956,7 +956,7 @@ def test_serialize_functools_partialmethod(self):
956956
string, imports = MigrationWriter.serialize(value)
957957
result = self.assertSerializedFunctoolsPartialEqual(
958958
value,
959-
"functools.partialmethod(datetime.timedelta, *(1,), **{'seconds': 2})",
959+
"functools.partialmethod(datetime.timedelta, 1, seconds=2)",
960960
{"import datetime", "import functools"},
961961
)
962962
self.assertIsInstance(result, functools.partialmethod)

0 commit comments

Comments
 (0)