1 # Copyright (c) 2010-2020 Benjamin Peterson
3 # Permission is hereby granted, free of charge, to any person obtaining a copy
4 # of this software and associated documentation files (the "Software"), to deal
5 # in the Software without restriction, including without limitation the rights
6 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 # copies of the Software, and to permit persons to whom the Software is
8 # furnished to do so, subject to the following conditions:
10 # The above copyright notice and this permission notice shall be included in all
11 # copies or substantial portions of the Software.
13 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 """Utilities for writing code that runs on Python 2 and 3"""
23 from __future__
import absolute_import
31 __author__
= "Benjamin Peterson <benjamin@python.org>"
32 __version__
= "1.14.0"
35 # Useful for very coarse version differentiation.
36 PY2
= sys
.version_info
[0] == 2
37 PY3
= sys
.version_info
[0] == 3
38 PY34
= sys
.version_info
>= (3, 4)
49 string_types
= basestring
,
50 integer_types
= (int, long)
51 class_types
= (type, types
.ClassType
)
55 if sys
.platform
.startswith("java"):
56 # Jython always uses 32 bits.
57 MAXSIZE
= int((1 << 31) - 1)
59 # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
68 MAXSIZE
= int((1 << 31) - 1)
71 MAXSIZE
= int((1 << 63) - 1)
75 def _add_doc(func
, doc
):
76 """Add documentation to a function."""
80 def _import_module(name
):
81 """Import module, returning the module after the last dot."""
83 return sys
.modules
[name
]
86 class _LazyDescr(object):
88 def __init__(self
, name
):
91 def __get__(self
, obj
, tp
):
92 result
= self
._resolve
()
93 setattr(obj
, self
.name
, result
) # Invokes __set__.
95 # This is a bit ugly, but it avoids running this again by
96 # removing this descriptor.
97 delattr(obj
.__class
__, self
.name
)
98 except AttributeError:
103 class MovedModule(_LazyDescr
):
105 def __init__(self
, name
, old
, new
=None):
106 super(MovedModule
, self
).__init
__(name
)
115 return _import_module(self
.mod
)
117 def __getattr__(self
, attr
):
118 _module
= self
._resolve
()
119 value
= getattr(_module
, attr
)
120 setattr(self
, attr
, value
)
124 class _LazyModule(types
.ModuleType
):
126 def __init__(self
, name
):
127 super(_LazyModule
, self
).__init
__(name
)
128 self
.__doc
__ = self
.__class
__.__doc
__
131 attrs
= ["__doc__", "__name__"]
132 attrs
+= [attr
.name
for attr
in self
._moved
_attributes
]
135 # Subclasses should override this
136 _moved_attributes
= []
139 class MovedAttribute(_LazyDescr
):
141 def __init__(self
, name
, old_mod
, new_mod
, old_attr
=None, new_attr
=None):
142 super(MovedAttribute
, self
).__init
__(name
)
160 module
= _import_module(self
.mod
)
161 return getattr(module
, self
.attr
)
164 class _SixMetaPathImporter(object):
167 A meta path importer to import six.moves and its submodules.
169 This class implements a PEP302 finder and loader. It should be compatible
170 with Python 2.5 and all existing versions of Python3
173 def __init__(self
, six_module_name
):
174 self
.name
= six_module_name
175 self
.known_modules
= {}
177 def _add_module(self
, mod
, *fullnames
):
178 for fullname
in fullnames
:
179 self
.known_modules
[self
.name
+ "." + fullname
] = mod
181 def _get_module(self
, fullname
):
182 return self
.known_modules
[self
.name
+ "." + fullname
]
184 def find_module(self
, fullname
, path
=None):
185 if fullname
in self
.known_modules
:
189 def __get_module(self
, fullname
):
191 return self
.known_modules
[fullname
]
193 raise ImportError("This loader does not know module " + fullname
)
195 def load_module(self
, fullname
):
197 # in case of a reload
198 return sys
.modules
[fullname
]
201 mod
= self
.__get
_module
(fullname
)
202 if isinstance(mod
, MovedModule
):
205 mod
.__loader
__ = self
206 sys
.modules
[fullname
] = mod
209 def is_package(self
, fullname
):
211 Return true, if the named module is a package.
213 We need this method to get correct spec objects with
214 Python 3.4 (see PEP451)
216 return hasattr(self
.__get
_module
(fullname
), "__path__")
218 def get_code(self
, fullname
):
221 Required, if is_package is implemented"""
222 self
.__get
_module
(fullname
) # eventually raises ImportError
224 get_source
= get_code
# same as get_code
226 _importer
= _SixMetaPathImporter(__name__
)
229 class _MovedItems(_LazyModule
):
231 """Lazy loading of moved objects"""
232 __path__
= [] # mark as package
235 _moved_attributes
= [
236 MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
237 MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
238 MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
239 MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
240 MovedAttribute("intern", "__builtin__", "sys"),
241 MovedAttribute("map", "itertools", "builtins", "imap", "map"),
242 MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
243 MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
244 MovedAttribute("getoutput", "commands", "subprocess"),
245 MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
246 MovedAttribute("reload_module", "__builtin__", "importlib" if PY34
else "imp", "reload"),
247 MovedAttribute("reduce", "__builtin__", "functools"),
248 MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
249 MovedAttribute("StringIO", "StringIO", "io"),
250 MovedAttribute("UserDict", "UserDict", "collections"),
251 MovedAttribute("UserList", "UserList", "collections"),
252 MovedAttribute("UserString", "UserString", "collections"),
253 MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
254 MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
255 MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
256 MovedModule("builtins", "__builtin__"),
257 MovedModule("configparser", "ConfigParser"),
258 MovedModule("collections_abc", "collections", "collections.abc" if sys
.version_info
>= (3, 3) else "collections"),
259 MovedModule("copyreg", "copy_reg"),
260 MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
261 MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
262 MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys
.version_info
< (3, 9) else "_thread"),
263 MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
264 MovedModule("http_cookies", "Cookie", "http.cookies"),
265 MovedModule("html_entities", "htmlentitydefs", "html.entities"),
266 MovedModule("html_parser", "HTMLParser", "html.parser"),
267 MovedModule("http_client", "httplib", "http.client"),
268 MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
269 MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
270 MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
271 MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
272 MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
273 MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
274 MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
275 MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
276 MovedModule("cPickle", "cPickle", "pickle"),
277 MovedModule("queue", "Queue"),
278 MovedModule("reprlib", "repr"),
279 MovedModule("socketserver", "SocketServer"),
280 MovedModule("_thread", "thread", "_thread"),
281 MovedModule("tkinter", "Tkinter"),
282 MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
283 MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
284 MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
285 MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
286 MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
287 MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
288 MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
289 MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
290 MovedModule("tkinter_colorchooser", "tkColorChooser",
291 "tkinter.colorchooser"),
292 MovedModule("tkinter_commondialog", "tkCommonDialog",
293 "tkinter.commondialog"),
294 MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
295 MovedModule("tkinter_font", "tkFont", "tkinter.font"),
296 MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
297 MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
298 "tkinter.simpledialog"),
299 MovedModule("urllib_parse", __name__
+ ".moves.urllib_parse", "urllib.parse"),
300 MovedModule("urllib_error", __name__
+ ".moves.urllib_error", "urllib.error"),
301 MovedModule("urllib", __name__
+ ".moves.urllib", __name__
+ ".moves.urllib"),
302 MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
303 MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
304 MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
306 # Add windows specific modules.
307 if sys
.platform
== "win32":
308 _moved_attributes
+= [
309 MovedModule("winreg", "_winreg"),
312 for attr
in _moved_attributes
:
313 setattr(_MovedItems
, attr
.name
, attr
)
314 if isinstance(attr
, MovedModule
):
315 _importer
._add
_module
(attr
, "moves." + attr
.name
)
318 _MovedItems
._moved
_attributes
= _moved_attributes
320 moves
= _MovedItems(__name__
+ ".moves")
321 _importer
._add
_module
(moves
, "moves")
324 class Module_six_moves_urllib_parse(_LazyModule
):
326 """Lazy loading of moved objects in six.moves.urllib_parse"""
329 _urllib_parse_moved_attributes
= [
330 MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
331 MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
332 MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
333 MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
334 MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
335 MovedAttribute("urljoin", "urlparse", "urllib.parse"),
336 MovedAttribute("urlparse", "urlparse", "urllib.parse"),
337 MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
338 MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
339 MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
340 MovedAttribute("quote", "urllib", "urllib.parse"),
341 MovedAttribute("quote_plus", "urllib", "urllib.parse"),
342 MovedAttribute("unquote", "urllib", "urllib.parse"),
343 MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
344 MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
345 MovedAttribute("urlencode", "urllib", "urllib.parse"),
346 MovedAttribute("splitquery", "urllib", "urllib.parse"),
347 MovedAttribute("splittag", "urllib", "urllib.parse"),
348 MovedAttribute("splituser", "urllib", "urllib.parse"),
349 MovedAttribute("splitvalue", "urllib", "urllib.parse"),
350 MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
351 MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
352 MovedAttribute("uses_params", "urlparse", "urllib.parse"),
353 MovedAttribute("uses_query", "urlparse", "urllib.parse"),
354 MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
356 for attr
in _urllib_parse_moved_attributes
:
357 setattr(Module_six_moves_urllib_parse
, attr
.name
, attr
)
360 Module_six_moves_urllib_parse
._moved
_attributes
= _urllib_parse_moved_attributes
362 _importer
._add
_module
(Module_six_moves_urllib_parse(__name__
+ ".moves.urllib_parse"),
363 "moves.urllib_parse", "moves.urllib.parse")
366 class Module_six_moves_urllib_error(_LazyModule
):
368 """Lazy loading of moved objects in six.moves.urllib_error"""
371 _urllib_error_moved_attributes
= [
372 MovedAttribute("URLError", "urllib2", "urllib.error"),
373 MovedAttribute("HTTPError", "urllib2", "urllib.error"),
374 MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
376 for attr
in _urllib_error_moved_attributes
:
377 setattr(Module_six_moves_urllib_error
, attr
.name
, attr
)
380 Module_six_moves_urllib_error
._moved
_attributes
= _urllib_error_moved_attributes
382 _importer
._add
_module
(Module_six_moves_urllib_error(__name__
+ ".moves.urllib.error"),
383 "moves.urllib_error", "moves.urllib.error")
386 class Module_six_moves_urllib_request(_LazyModule
):
388 """Lazy loading of moved objects in six.moves.urllib_request"""
391 _urllib_request_moved_attributes
= [
392 MovedAttribute("urlopen", "urllib2", "urllib.request"),
393 MovedAttribute("install_opener", "urllib2", "urllib.request"),
394 MovedAttribute("build_opener", "urllib2", "urllib.request"),
395 MovedAttribute("pathname2url", "urllib", "urllib.request"),
396 MovedAttribute("url2pathname", "urllib", "urllib.request"),
397 MovedAttribute("getproxies", "urllib", "urllib.request"),
398 MovedAttribute("Request", "urllib2", "urllib.request"),
399 MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
400 MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
401 MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
402 MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
403 MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
404 MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
405 MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
406 MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
407 MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
408 MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
409 MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
410 MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
411 MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
412 MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
413 MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
414 MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
415 MovedAttribute("FileHandler", "urllib2", "urllib.request"),
416 MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
417 MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
418 MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
419 MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
420 MovedAttribute("urlretrieve", "urllib", "urllib.request"),
421 MovedAttribute("urlcleanup", "urllib", "urllib.request"),
422 MovedAttribute("URLopener", "urllib", "urllib.request"),
423 MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
424 MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
425 MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
426 MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
428 for attr
in _urllib_request_moved_attributes
:
429 setattr(Module_six_moves_urllib_request
, attr
.name
, attr
)
432 Module_six_moves_urllib_request
._moved
_attributes
= _urllib_request_moved_attributes
434 _importer
._add
_module
(Module_six_moves_urllib_request(__name__
+ ".moves.urllib.request"),
435 "moves.urllib_request", "moves.urllib.request")
438 class Module_six_moves_urllib_response(_LazyModule
):
440 """Lazy loading of moved objects in six.moves.urllib_response"""
443 _urllib_response_moved_attributes
= [
444 MovedAttribute("addbase", "urllib", "urllib.response"),
445 MovedAttribute("addclosehook", "urllib", "urllib.response"),
446 MovedAttribute("addinfo", "urllib", "urllib.response"),
447 MovedAttribute("addinfourl", "urllib", "urllib.response"),
449 for attr
in _urllib_response_moved_attributes
:
450 setattr(Module_six_moves_urllib_response
, attr
.name
, attr
)
453 Module_six_moves_urllib_response
._moved
_attributes
= _urllib_response_moved_attributes
455 _importer
._add
_module
(Module_six_moves_urllib_response(__name__
+ ".moves.urllib.response"),
456 "moves.urllib_response", "moves.urllib.response")
459 class Module_six_moves_urllib_robotparser(_LazyModule
):
461 """Lazy loading of moved objects in six.moves.urllib_robotparser"""
464 _urllib_robotparser_moved_attributes
= [
465 MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
467 for attr
in _urllib_robotparser_moved_attributes
:
468 setattr(Module_six_moves_urllib_robotparser
, attr
.name
, attr
)
471 Module_six_moves_urllib_robotparser
._moved
_attributes
= _urllib_robotparser_moved_attributes
473 _importer
._add
_module
(Module_six_moves_urllib_robotparser(__name__
+ ".moves.urllib.robotparser"),
474 "moves.urllib_robotparser", "moves.urllib.robotparser")
477 class Module_six_moves_urllib(types
.ModuleType
):
479 """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
480 __path__
= [] # mark as package
481 parse
= _importer
._get
_module
("moves.urllib_parse")
482 error
= _importer
._get
_module
("moves.urllib_error")
483 request
= _importer
._get
_module
("moves.urllib_request")
484 response
= _importer
._get
_module
("moves.urllib_response")
485 robotparser
= _importer
._get
_module
("moves.urllib_robotparser")
488 return ['parse', 'error', 'request', 'response', 'robotparser']
490 _importer
._add
_module
(Module_six_moves_urllib(__name__
+ ".moves.urllib"),
495 """Add an item to six.moves."""
496 setattr(_MovedItems
, move
.name
, move
)
499 def remove_move(name
):
500 """Remove item from six.moves."""
502 delattr(_MovedItems
, name
)
503 except AttributeError:
505 del moves
.__dict
__[name
]
507 raise AttributeError("no such move, %r" % (name
,))
511 _meth_func
= "__func__"
512 _meth_self
= "__self__"
514 _func_closure
= "__closure__"
515 _func_code
= "__code__"
516 _func_defaults
= "__defaults__"
517 _func_globals
= "__globals__"
519 _meth_func
= "im_func"
520 _meth_self
= "im_self"
522 _func_closure
= "func_closure"
523 _func_code
= "func_code"
524 _func_defaults
= "func_defaults"
525 _func_globals
= "func_globals"
529 advance_iterator
= next
531 def advance_iterator(it
):
533 next
= advance_iterator
540 return any("__call__" in klass
.__dict
__ for klass
in type(obj
).__mro
__)
544 def get_unbound_function(unbound
):
547 create_bound_method
= types
.MethodType
549 def create_unbound_method(func
, cls
):
554 def get_unbound_function(unbound
):
555 return unbound
.im_func
557 def create_bound_method(func
, obj
):
558 return types
.MethodType(func
, obj
, obj
.__class
__)
560 def create_unbound_method(func
, cls
):
561 return types
.MethodType(func
, None, cls
)
563 class Iterator(object):
566 return type(self
).__next
__(self
)
569 _add_doc(get_unbound_function
,
570 """Get the function out of a possibly unbound function""")
573 get_method_function
= operator
.attrgetter(_meth_func
)
574 get_method_self
= operator
.attrgetter(_meth_self
)
575 get_function_closure
= operator
.attrgetter(_func_closure
)
576 get_function_code
= operator
.attrgetter(_func_code
)
577 get_function_defaults
= operator
.attrgetter(_func_defaults
)
578 get_function_globals
= operator
.attrgetter(_func_globals
)
582 def iterkeys(d
, **kw
):
583 return iter(d
.keys(**kw
))
585 def itervalues(d
, **kw
):
586 return iter(d
.values(**kw
))
588 def iteritems(d
, **kw
):
589 return iter(d
.items(**kw
))
591 def iterlists(d
, **kw
):
592 return iter(d
.lists(**kw
))
594 viewkeys
= operator
.methodcaller("keys")
596 viewvalues
= operator
.methodcaller("values")
598 viewitems
= operator
.methodcaller("items")
600 def iterkeys(d
, **kw
):
601 return d
.iterkeys(**kw
)
603 def itervalues(d
, **kw
):
604 return d
.itervalues(**kw
)
606 def iteritems(d
, **kw
):
607 return d
.iteritems(**kw
)
609 def iterlists(d
, **kw
):
610 return d
.iterlists(**kw
)
612 viewkeys
= operator
.methodcaller("viewkeys")
614 viewvalues
= operator
.methodcaller("viewvalues")
616 viewitems
= operator
.methodcaller("viewitems")
618 _add_doc(iterkeys
, "Return an iterator over the keys of a dictionary.")
619 _add_doc(itervalues
, "Return an iterator over the values of a dictionary.")
621 "Return an iterator over the (key, value) pairs of a dictionary.")
623 "Return an iterator over the (key, [values]) pairs of a dictionary.")
628 return s
.encode("latin-1")
634 int2byte
= struct
.Struct(">B").pack
636 byte2int
= operator
.itemgetter(0)
637 indexbytes
= operator
.getitem
640 StringIO
= io
.StringIO
643 _assertCountEqual
= "assertCountEqual"
644 if sys
.version_info
<= (3, 1):
645 _assertRaisesRegex
= "assertRaisesRegexp"
646 _assertRegex
= "assertRegexpMatches"
647 _assertNotRegex
= "assertNotRegexpMatches"
649 _assertRaisesRegex
= "assertRaisesRegex"
650 _assertRegex
= "assertRegex"
651 _assertNotRegex
= "assertNotRegex"
655 # Workaround for standalone backslash
658 return unicode(s
.replace(r
'\\', r
'\\\\'), "unicode_escape")
665 def indexbytes(buf
, i
):
667 iterbytes
= functools
.partial(itertools
.imap
, ord)
669 StringIO
= BytesIO
= StringIO
.StringIO
670 _assertCountEqual
= "assertItemsEqual"
671 _assertRaisesRegex
= "assertRaisesRegexp"
672 _assertRegex
= "assertRegexpMatches"
673 _assertNotRegex
= "assertNotRegexpMatches"
674 _add_doc(b
, """Byte literal""")
675 _add_doc(u
, """Text literal""")
678 def assertCountEqual(self
, *args
, **kwargs
):
679 return getattr(self
, _assertCountEqual
)(*args
, **kwargs
)
682 def assertRaisesRegex(self
, *args
, **kwargs
):
683 return getattr(self
, _assertRaisesRegex
)(*args
, **kwargs
)
686 def assertRegex(self
, *args
, **kwargs
):
687 return getattr(self
, _assertRegex
)(*args
, **kwargs
)
690 def assertNotRegex(self
, *args
, **kwargs
):
691 return getattr(self
, _assertNotRegex
)(*args
, **kwargs
)
695 exec_
= getattr(moves
.builtins
, "exec")
697 def reraise(tp
, value
, tb
=None):
701 if value
.__traceback
__ is not tb
:
702 raise value
.with_traceback(tb
)
709 def exec_(_code_
, _globs_
=None, _locs_
=None):
710 """Execute code in a namespace."""
712 frame
= sys
._getframe
(1)
713 _globs_
= frame
.f_globals
715 _locs_
= frame
.f_locals
719 exec("""exec _code_ in _globs_, _locs_""")
721 exec_("""def reraise(tp, value, tb=None):
729 if sys
.version_info
> (3,):
730 exec_("""def raise_from(value, from_value):
732 raise value from from_value
737 def raise_from(value
, from_value
):
741 print_
= getattr(moves
.builtins
, "print", None)
743 def print_(*args
, **kwargs
):
744 """The new-style print function for Python 2.4 and 2.5."""
745 fp
= kwargs
.pop("file", sys
.stdout
)
750 if not isinstance(data
, basestring
):
752 # If the file has an encoding, encode unicode with it.
753 if (isinstance(fp
, file) and
754 isinstance(data
, unicode) and
755 fp
.encoding
is not None):
756 errors
= getattr(fp
, "errors", None)
759 data
= data
.encode(fp
.encoding
, errors
)
762 sep
= kwargs
.pop("sep", None)
764 if isinstance(sep
, unicode):
766 elif not isinstance(sep
, str):
767 raise TypeError("sep must be None or a string")
768 end
= kwargs
.pop("end", None)
770 if isinstance(end
, unicode):
772 elif not isinstance(end
, str):
773 raise TypeError("end must be None or a string")
775 raise TypeError("invalid keyword arguments to print()")
778 if isinstance(arg
, unicode):
782 newline
= unicode("\n")
791 for i
, arg
in enumerate(args
):
796 if sys
.version_info
< (3, 3):
799 def print_(*args
, **kwargs
):
800 fp
= kwargs
.get("file", sys
.stdout
)
801 flush
= kwargs
.pop("flush", False)
802 _print(*args
, **kwargs
)
803 if flush
and fp
is not None:
806 _add_doc(reraise
, """Reraise an exception.""")
808 if sys
.version_info
< (3, 4):
809 # This does exactly the same what the :func:`py3:functools.update_wrapper`
810 # function does on Python versions after 3.2. It sets the ``__wrapped__``
811 # attribute on ``wrapper`` object and it doesn't raise an error if any of
812 # the attributes mentioned in ``assigned`` and ``updated`` are missing on
813 # ``wrapped`` object.
814 def _update_wrapper(wrapper
, wrapped
,
815 assigned
=functools
.WRAPPER_ASSIGNMENTS
,
816 updated
=functools
.WRAPPER_UPDATES
):
817 for attr
in assigned
:
819 value
= getattr(wrapped
, attr
)
820 except AttributeError:
823 setattr(wrapper
, attr
, value
)
825 getattr(wrapper
, attr
).update(getattr(wrapped
, attr
, {}))
826 wrapper
.__wrapped
__ = wrapped
828 _update_wrapper
.__doc
__ = functools
.update_wrapper
.__doc
__
830 def wraps(wrapped
, assigned
=functools
.WRAPPER_ASSIGNMENTS
,
831 updated
=functools
.WRAPPER_UPDATES
):
832 return functools
.partial(_update_wrapper
, wrapped
=wrapped
,
833 assigned
=assigned
, updated
=updated
)
834 wraps
.__doc
__ = functools
.wraps
.__doc
__
837 wraps
= functools
.wraps
840 def with_metaclass(meta
, *bases
):
841 """Create a base class with a metaclass."""
842 # This requires a bit of explanation: the basic idea is to make a dummy
843 # metaclass for one level of class instantiation that replaces itself with
844 # the actual metaclass.
845 class metaclass(type):
847 def __new__(cls
, name
, this_bases
, d
):
848 if sys
.version_info
>= (3, 7):
849 # This version introduced PEP 560 that requires a bit
850 # of extra care (we mimic what is done by __build_class__).
851 resolved_bases
= types
.resolve_bases(bases
)
852 if resolved_bases
is not bases
:
853 d
['__orig_bases__'] = bases
855 resolved_bases
= bases
856 return meta(name
, resolved_bases
, d
)
859 def __prepare__(cls
, name
, this_bases
):
860 return meta
.__prepare
__(name
, bases
)
861 return type.__new
__(metaclass
, 'temporary_class', (), {})
864 def add_metaclass(metaclass
):
865 """Class decorator for creating a class with a metaclass."""
867 orig_vars
= cls
.__dict
__.copy()
868 slots
= orig_vars
.get('__slots__')
869 if slots
is not None:
870 if isinstance(slots
, str):
872 for slots_var
in slots
:
873 orig_vars
.pop(slots_var
)
874 orig_vars
.pop('__dict__', None)
875 orig_vars
.pop('__weakref__', None)
876 if hasattr(cls
, '__qualname__'):
877 orig_vars
['__qualname__'] = cls
.__qualname
__
878 return metaclass(cls
.__name
__, cls
.__bases
__, orig_vars
)
882 def ensure_binary(s
, encoding
='utf-8', errors
='strict'):
883 """Coerce **s** to six.binary_type.
886 - `unicode` -> encoded to `str`
890 - `str` -> encoded to `bytes`
893 if isinstance(s
, text_type
):
894 return s
.encode(encoding
, errors
)
895 elif isinstance(s
, binary_type
):
898 raise TypeError("not expecting type '%s'" % type(s
))
901 def ensure_str(s
, encoding
='utf-8', errors
='strict'):
902 """Coerce *s* to `str`.
905 - `unicode` -> encoded to `str`
910 - `bytes` -> decoded to `str`
912 if not isinstance(s
, (text_type
, binary_type
)):
913 raise TypeError("not expecting type '%s'" % type(s
))
914 if PY2
and isinstance(s
, text_type
):
915 s
= s
.encode(encoding
, errors
)
916 elif PY3
and isinstance(s
, binary_type
):
917 s
= s
.decode(encoding
, errors
)
921 def ensure_text(s
, encoding
='utf-8', errors
='strict'):
922 """Coerce *s* to six.text_type.
925 - `unicode` -> `unicode`
930 - `bytes` -> decoded to `str`
932 if isinstance(s
, binary_type
):
933 return s
.decode(encoding
, errors
)
934 elif isinstance(s
, text_type
):
937 raise TypeError("not expecting type '%s'" % type(s
))
940 def python_2_unicode_compatible(klass
):
942 A class decorator that defines __unicode__ and __str__ methods under Python 2.
943 Under Python 3 it does nothing.
945 To support Python 2 and 3 with a single code base, define a __str__ method
946 returning text and apply this decorator to the class.
949 if '__str__' not in klass
.__dict
__:
950 raise ValueError("@python_2_unicode_compatible cannot be applied "
951 "to %s because it doesn't define __str__()." %
953 klass
.__unicode
__ = klass
.__str
__
954 klass
.__str
__ = lambda self
: self
.__unicode
__().encode('utf-8')
958 # Complete the moves implementation.
959 # This code is at the end of this module to speed up module loading.
960 # Turn this module into a package.
961 __path__
= [] # required for PEP 302 and PEP 451
962 __package__
= __name__
# see PEP 366 @ReservedAssignment
963 if globals().get("__spec__") is not None:
964 __spec__
.submodule_search_locations
= [] # PEP 451 @UndefinedVariable
965 # Remove other six meta path importers, since they cause problems. This can
966 # happen if six is removed from sys.modules and then reloaded. (Setuptools does
967 # this for some reason.)
969 for i
, importer
in enumerate(sys
.meta_path
):
970 # Here's some real nastiness: Another "instance" of the six module might
971 # be floating around. Therefore, we can't use isinstance() to check for
972 # the six meta path importer, since the other six instance will have
973 # inserted an importer with different class.
974 if (type(importer
).__name
__ == "_SixMetaPathImporter" and
975 importer
.name
== __name__
):
979 # Finally, add the importer to the meta path import hook.
980 sys
.meta_path
.append(_importer
)