@@ -33,6 +33,7 @@ class creation via :func:`builtins.type` -- i.e. taking a class name, a tuple of
33
33
from __future__ import annotations
34
34
35
35
from abc import ABCMeta
36
+ from collections .abc import Callable
36
37
from functools import wraps
37
38
from importlib import import_module
38
39
from inspect import Parameter , signature
@@ -57,7 +58,7 @@ class _FactoryTown(metaclass=_SingleInstance):
57
58
factory object.
58
59
"""
59
60
60
- factories = {}
61
+ factories : dict [ str , _ClassFactory ] = {}
61
62
62
63
@classmethod
63
64
def clear (cls ):
@@ -69,10 +70,12 @@ def clear(cls):
69
70
cls .factories = {}
70
71
71
72
@staticmethod
72
- def _factory_address (factory_function : callable ) -> str :
73
+ def _factory_address (factory_function : Callable ) -> str :
73
74
return f"{ factory_function .__module__ } .{ factory_function .__qualname__ } "
74
75
75
- def get_factory (self , factory_function : callable [..., type ]) -> _ClassFactory :
76
+ def get_factory (
77
+ self , factory_function : Callable [..., tuple [str , tuple [type , ...], dict , dict ]]
78
+ ) -> _ClassFactory :
76
79
77
80
self ._verify_function_only_takes_positional_args (factory_function )
78
81
@@ -103,7 +106,7 @@ def _build_factory(factory_function):
103
106
return wraps (factory_function )(new_factory_class ())
104
107
105
108
@staticmethod
106
- def _verify_function_only_takes_positional_args (factory_function : callable ):
109
+ def _verify_function_only_takes_positional_args (factory_function : Callable ):
107
110
parameters = signature (factory_function ).parameters .values ()
108
111
if any (
109
112
p .kind not in [Parameter .POSITIONAL_ONLY , Parameter .VAR_POSITIONAL ]
@@ -136,7 +139,9 @@ class _ClassFactory(metaclass=_SingleInstance):
136
139
For making dynamically created classes the same class.
137
140
"""
138
141
139
- _decorated_as_classfactory : ClassVar [bool ] = False
142
+ _decorated_as_classfactory : bool = False
143
+ factory_function : ClassVar [Callable [..., tuple [str , tuple [type , ...], dict , dict ]]]
144
+ class_registry : ClassVar [dict [str , type [_FactoryMade ]]] = {}
140
145
141
146
def __init_subclass__ (cls , / , factory_function , ** kwargs ):
142
147
super ().__init_subclass__ (** kwargs )
@@ -193,7 +198,7 @@ def _build_class(
193
198
if "__module__" not in class_dict :
194
199
class_dict ["__module__" ] = self .factory_function .__module__
195
200
if "__qualname__" not in class_dict :
196
- class_dict ["__qualname__" ] = f"{ self .__qualname__ } .{ name } "
201
+ class_dict ["__qualname__" ] = f"{ self .factory_function . __qualname__ } .{ name } "
197
202
sc_init_kwargs ["class_factory" ] = self
198
203
sc_init_kwargs ["class_factory_args" ] = class_factory_args
199
204
@@ -248,7 +253,7 @@ class _FactoryMade:
248
253
"""
249
254
250
255
# DEPRECATED: Use _reduce_imports_as instead
251
- _class_returns_from_decorated_function : ClassVar [callable | None ] = None
256
+ _class_returns_from_decorated_function : ClassVar [Callable | None ] = None
252
257
253
258
_reduce_imports_as : ClassVar [tuple [str , str ] | None ] = None # Module and qualname
254
259
@@ -337,7 +342,7 @@ def _instantiate_from_decorated(module, qualname, newargs_ex):
337
342
338
343
339
344
def classfactory (
340
- factory_function : callable [..., tuple [str , tuple [type , ...], dict , dict ]],
345
+ factory_function : Callable [..., tuple [str , tuple [type , ...], dict , dict ]],
341
346
) -> _ClassFactory :
342
347
"""
343
348
A decorator for building dynamic class factories whose classes are unique and whose
@@ -354,7 +359,7 @@ def classfactory(
354
359
be overridden.
355
360
356
361
Args:
357
- factory_function (callable [..., tuple[str, tuple[type, ...], dict, dict]]):
362
+ factory_function (Callable [..., tuple[str, tuple[type, ...], dict, dict]]):
358
363
A function returning arguments that would be passed to `builtins.type` to
359
364
dynamically generate a class. The function must accept exclusively
360
365
positional arguments
0 commit comments