1- from __future__ import unicode_literals
2- import six
3-
4- PY2 = six .PY2
5- PY3 = six .PY3
6-
7- # conversions
8- unichr = six .unichr
9- if PY3 :
10- long_ = int
11- else :
12- long_ = long
13- text_type = six .text_type
14- string_types = six .string_types
15- integer_types = six .integer_types
16- bool_types = (bool , )
17- binary_types = (six .binary_type , )
18- float_types = (float , )
19- array_types = (tuple , list )
20- int_to_byte = six .int2byte
21-
22- # iterator functions
23- iterkeys = six .iterkeys
24- itervalues = six .itervalues
25- iteritems = six .iteritems
26- iterlists = six .iterlists
27- iterbytes = six .iterbytes
28- reraise = six .reraise
29-
30- with_metaclass = six .with_metaclass
31- add_metaclass = six .add_metaclass
32- print_ = six .print_
33- urllib = six .moves .urllib
34-
35- get_method_self = six .get_method_self
1+ import sys
2+ import types
3+
4+
5+ def with_metaclass (meta , * bases ):
6+ """Create a base class with a metaclass."""
7+ # This requires a bit of explanation: the basic idea is to make a dummy
8+ # metaclass for one level of class instantiation that replaces itself with
9+ # the actual metaclass.
10+ class metaclass (type ):
11+ def __new__ (cls , name , this_bases , d ):
12+ if sys .version_info [:2 ] >= (3 , 7 ):
13+ # This version introduced PEP 560 that requires a bit
14+ # of extra care (we mimic what is done by __build_class__).
15+ resolved_bases = types .resolve_bases (bases )
16+ if resolved_bases is not bases :
17+ d ["__orig_bases__" ] = bases
18+ else :
19+ resolved_bases = bases
20+ return meta (name , resolved_bases , d )
21+
22+ @classmethod
23+ def __prepare__ (cls , name , this_bases ):
24+ return meta .__prepare__ (name , bases )
25+
26+ return type .__new__ (metaclass , "temporary_class" , (), {})
27+
28+
29+ def add_metaclass (metaclass ):
30+ """Class decorator for creating a class with a metaclass."""
31+
32+ def wrapper (cls ):
33+ orig_vars = cls .__dict__ .copy ()
34+ slots = orig_vars .get ("__slots__" )
35+ if slots is not None :
36+ if isinstance (slots , str ):
37+ slots = [slots ]
38+ for slots_var in slots :
39+ orig_vars .pop (slots_var )
40+ orig_vars .pop ("__dict__" , None )
41+ orig_vars .pop ("__weakref__" , None )
42+ if hasattr (cls , "__qualname__" ):
43+ orig_vars ["__qualname__" ] = cls .__qualname__
44+ return metaclass (cls .__name__ , cls .__bases__ , orig_vars )
45+
46+ return wrapper
0 commit comments