@@ -116,6 +116,20 @@ def add_to_function(self, *args, **kwargs):
116
116
117
117
@classfactory
118
118
def adder_factory (fnc , n , / ):
119
+ return (
120
+ f"{ AddsNandX .__name__ } { fnc .__name__ } " ,
121
+ (AddsNandX ,),
122
+ {
123
+ "fnc" : staticmethod (fnc ),
124
+ "n" : n ,
125
+ "_reduce_imports_as" : (fnc .__module__ , fnc .__qualname__ )
126
+ },
127
+ {},
128
+ )
129
+
130
+
131
+ @classfactory
132
+ def deprecated_adder_factory (fnc , n , / ):
119
133
return (
120
134
f"{ AddsNandX .__name__ } { fnc .__name__ } " ,
121
135
(AddsNandX ,),
@@ -131,7 +145,7 @@ def adder_factory(fnc, n, /):
131
145
def add_to_this_decorator (n ):
132
146
def wrapped (fnc ):
133
147
factory_made = adder_factory (fnc , n )
134
- factory_made ._class_returns_from_decorated_function = fnc
148
+ factory_made ._reduce_imports_as = ( fnc . __module__ , fnc . __qualname__ )
135
149
return factory_made
136
150
return wrapped
137
151
@@ -141,6 +155,19 @@ def adds_5_plus_x(y: int):
141
155
return y
142
156
143
157
158
+ def deprecated_add_to_this_decorator (n ):
159
+ def wrapped (fnc ):
160
+ factory_made = adder_factory (fnc , n )
161
+ factory_made ._class_returns_from_decorated_function = fnc
162
+ return factory_made
163
+ return wrapped
164
+
165
+
166
+ @deprecated_add_to_this_decorator (5 )
167
+ def deprecated_adds_5_plus_x (y : int ):
168
+ return y
169
+
170
+
144
171
class TestClassfactory (unittest .TestCase ):
145
172
146
173
def test_factory_initialization (self ):
@@ -474,21 +501,23 @@ def test_other_decorators(self):
474
501
In case the factory-produced class itself comes from a decorator, we need to
475
502
check that name conflicts between the class and decorated function are handled.
476
503
"""
477
- a5 = adds_5_plus_x (2 )
478
- self .assertIsInstance (a5 , AddsNandX )
479
- self .assertIsInstance (a5 , _FactoryMade )
480
- self .assertEqual (5 , a5 .n )
481
- self .assertEqual (2 , a5 .x )
482
- self .assertEqual (
483
- 1 + 5 + 2 , # y + n=5 + x=2
484
- a5 .add_to_function (1 ),
485
- msg = "Should execute the function as part of call"
486
- )
487
-
488
- reloaded = pickle .loads (pickle .dumps (a5 ))
489
- self .assertEqual (a5 .n , reloaded .n )
490
- self .assertIs (a5 .fnc , reloaded .fnc )
491
- self .assertEqual (a5 .x , reloaded .x )
504
+ for fnc in [adds_5_plus_x , deprecated_adds_5_plus_x ]:
505
+ with self .subTest (fnc .__name__ ):
506
+ a5 = fnc (2 )
507
+ self .assertIsInstance (a5 , AddsNandX )
508
+ self .assertIsInstance (a5 , _FactoryMade )
509
+ self .assertEqual (5 , a5 .n )
510
+ self .assertEqual (2 , a5 .x )
511
+ self .assertEqual (
512
+ 1 + 5 + 2 , # y + n=5 + x=2
513
+ a5 .add_to_function (1 ),
514
+ msg = "Should execute the function as part of call"
515
+ )
516
+
517
+ reloaded = pickle .loads (pickle .dumps (a5 ))
518
+ self .assertEqual (a5 .n , reloaded .n )
519
+ self .assertIs (a5 .fnc , reloaded .fnc )
520
+ self .assertEqual (a5 .x , reloaded .x )
492
521
493
522
def test_other_decorators_inside_locals (self ):
494
523
@add_to_this_decorator (6 )
0 commit comments