@@ -20,26 +20,58 @@ def __setitem__(self, type_, function):
20
20
self .move_to_end (base )
21
21
22
22
23
- class JSONEncoderStar (stdlib_json .JSONEncoder ):
23
+ class EncoderMeta (type ):
24
+ def __new__ (mcs , name , bases , namespace ):
25
+ if "_default_functional_encoders" not in namespace :
26
+ namespace ["_default_functional_encoders" ] = []
27
+
28
+ if "_default_typed_encoders" not in namespace :
29
+ namespace ["_default_typed_encoders" ] = TypedEncoderRegistry ()
30
+
31
+ return super ().__new__ (mcs , name , bases , namespace )
32
+
33
+
34
+ class JSONEncoderStar (stdlib_json .JSONEncoder , metaclass = EncoderMeta ):
24
35
class FUNCTIONAL :
25
36
"""Sentinel type to register a functional encoder."""
26
37
27
- default_typed_encoders = TypedEncoderRegistry (DEFAULT_TYPED_ENCODERS )
28
- default_functional_encoders = DEFAULT_FUNCTIONAL_ENCODERS
38
+ _default_typed_encoders = TypedEncoderRegistry (DEFAULT_TYPED_ENCODERS )
39
+ _default_functional_encoders = DEFAULT_FUNCTIONAL_ENCODERS
29
40
30
41
def __init__ (self , * args , functional_encoders = (), typed_encoders : dict [type , callable ] = NULL_DICT , ** kwargs ):
31
42
super ().__init__ (* args , ** kwargs )
32
43
33
44
self ._typed_encoders = TypedEncoderRegistry (typed_encoders )
34
45
self ._functional_encoders = [* functional_encoders ]
35
46
47
+ @classmethod
48
+ def default_functional_encoders (cls ):
49
+ if cls is JSONEncoderStar :
50
+ return cls ._default_functional_encoders
51
+ else :
52
+ return cls ._default_functional_encoders + cls .__base__ .default_functional_encoders ()
53
+
54
+ @classmethod
55
+ def default_typed_encoders (cls ):
56
+ if cls is JSONEncoderStar :
57
+ return cls ._default_typed_encoders
58
+ else :
59
+ a = cls ._default_typed_encoders
60
+ b = cls .__base__ .default_typed_encoders ()
61
+ c = ChainMap (a , b )
62
+ d = TypedEncoderRegistry (c )
63
+ return d
64
+ # return TypedEncoderRegistry(ChainMap(cls.__base__.default_typed_encoders(), cls._default_typed_encoders))
65
+
36
66
@property
37
67
def functional_encoders (self ):
38
- return chain (self ._functional_encoders , self .default_functional_encoders )
68
+ return chain (self ._functional_encoders , self .default_functional_encoders () )
39
69
40
70
@property
41
71
def typed_encoders (self ):
42
- return ChainMap (self ._typed_encoders , self .default_typed_encoders )
72
+ i = self ._typed_encoders
73
+ base = self .default_typed_encoders ()
74
+ return ChainMap (i , base )
43
75
44
76
def register (self , function , type_ = FUNCTIONAL ):
45
77
if type_ is self .FUNCTIONAL :
@@ -50,9 +82,9 @@ def register(self, function, type_=FUNCTIONAL):
50
82
@classmethod
51
83
def register_default_encoder (cls , function , type_ = FUNCTIONAL ):
52
84
if type_ is cls .FUNCTIONAL :
53
- cls .default_functional_encoders .append (function )
85
+ cls ._default_functional_encoders .append (function )
54
86
else :
55
- cls .default_typed_encoders [type_ ] = function
87
+ cls ._default_typed_encoders [type_ ] = function
56
88
57
89
def default (self , o ) -> str :
58
90
for base , encoder in self .typed_encoders .items ():
0 commit comments