1 """Utilities for writing code that runs on Python 2 and 3"""
3 # Copyright (c) 2010-2015 Benjamin Peterson
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to deal
7 # in the Software without restriction, including without limitation the rights
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 # copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice shall be included in all
13 # copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 from __future__
import absolute_import
31 __author__
= "Benjamin Peterson <benjamin@python.org>"
32 __version__
= "1.10.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
[0:2] >= (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("range", "__builtin__", "builtins", "xrange", "range"),
245 MovedAttribute("reload_module", "__builtin__", "importlib" if PY34
else "imp", "reload"),
246 MovedAttribute("reduce", "__builtin__", "functools"),
247 MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
248 MovedAttribute("StringIO", "StringIO", "io"),
249 MovedAttribute("UserDict", "UserDict", "collections"),
250 MovedAttribute("UserList", "UserList", "collections"),
251 MovedAttribute("UserString", "UserString", "collections"),
252 MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
253 MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
254 MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
255 MovedModule("builtins", "__builtin__"),
256 MovedModule("configparser", "ConfigParser"),
257 MovedModule("copyreg", "copy_reg"),
258 MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
259 MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
260 MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
261 MovedModule("http_cookies", "Cookie", "http.cookies"),
262 MovedModule("html_entities", "htmlentitydefs", "html.entities"),
263 MovedModule("html_parser", "HTMLParser", "html.parser"),
264 MovedModule("http_client", "httplib", "http.client"),
265 MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
266 MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
267 MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
268 MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
269 MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
270 MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
271 MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
272 MovedModule("cPickle", "cPickle", "pickle"),
273 MovedModule("queue", "Queue"),
274 MovedModule("reprlib", "repr"),
275 MovedModule("socketserver", "SocketServer"),
276 MovedModule("_thread", "thread", "_thread"),
277 MovedModule("tkinter", "Tkinter"),
278 MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
279 MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
280 MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
281 MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
282 MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
283 MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
284 MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
285 MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
286 MovedModule("tkinter_colorchooser", "tkColorChooser",
287 "tkinter.colorchooser"),
288 MovedModule("tkinter_commondialog", "tkCommonDialog",
289 "tkinter.commondialog"),
290 MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
291 MovedModule("tkinter_font", "tkFont", "tkinter.font"),
292 MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
293 MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
294 "tkinter.simpledialog"),
295 MovedModule("urllib_parse", __name__
+ ".moves.urllib_parse", "urllib.parse"),
296 MovedModule("urllib_error", __name__
+ ".moves.urllib_error", "urllib.error"),
297 MovedModule("urllib", __name__
+ ".moves.urllib", __name__
+ ".moves.urllib"),
298 MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
299 MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
300 MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
302 # Add windows specific modules.
303 if sys
.platform
== "win32":
304 _moved_attributes
+= [
305 MovedModule("winreg", "_winreg"),
308 for attr
in _moved_attributes
:
309 setattr(_MovedItems
, attr
.name
, attr
)
310 if isinstance(attr
, MovedModule
):
311 _importer
._add
_module
(attr
, "moves." + attr
.name
)
314 _MovedItems
._moved
_attributes
= _moved_attributes
316 moves
= _MovedItems(__name__
+ ".moves")
317 _importer
._add
_module
(moves
, "moves")
320 class Module_six_moves_urllib_parse(_LazyModule
):
322 """Lazy loading of moved objects in six.moves.urllib_parse"""
325 _urllib_parse_moved_attributes
= [
326 MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
327 MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
328 MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
329 MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
330 MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
331 MovedAttribute("urljoin", "urlparse", "urllib.parse"),
332 MovedAttribute("urlparse", "urlparse", "urllib.parse"),
333 MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
334 MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
335 MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
336 MovedAttribute("quote", "urllib", "urllib.parse"),
337 MovedAttribute("quote_plus", "urllib", "urllib.parse"),
338 MovedAttribute("unquote", "urllib", "urllib.parse"),
339 MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
340 MovedAttribute("urlencode", "urllib", "urllib.parse"),
341 MovedAttribute("splitquery", "urllib", "urllib.parse"),
342 MovedAttribute("splittag", "urllib", "urllib.parse"),
343 MovedAttribute("splituser", "urllib", "urllib.parse"),
344 MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
345 MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
346 MovedAttribute("uses_params", "urlparse", "urllib.parse"),
347 MovedAttribute("uses_query", "urlparse", "urllib.parse"),
348 MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
350 for attr
in _urllib_parse_moved_attributes
:
351 setattr(Module_six_moves_urllib_parse
, attr
.name
, attr
)
354 Module_six_moves_urllib_parse
._moved
_attributes
= _urllib_parse_moved_attributes
356 _importer
._add
_module
(
357 Module_six_moves_urllib_parse(
359 ".moves.urllib_parse"),
360 "moves.urllib_parse",
361 "moves.urllib.parse")
364 class Module_six_moves_urllib_error(_LazyModule
):
366 """Lazy loading of moved objects in six.moves.urllib_error"""
369 _urllib_error_moved_attributes
= [
370 MovedAttribute("URLError", "urllib2", "urllib.error"),
371 MovedAttribute("HTTPError", "urllib2", "urllib.error"),
372 MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
374 for attr
in _urllib_error_moved_attributes
:
375 setattr(Module_six_moves_urllib_error
, attr
.name
, attr
)
378 Module_six_moves_urllib_error
._moved
_attributes
= _urllib_error_moved_attributes
380 _importer
._add
_module
(
381 Module_six_moves_urllib_error(
383 ".moves.urllib.error"),
384 "moves.urllib_error",
385 "moves.urllib.error")
388 class Module_six_moves_urllib_request(_LazyModule
):
390 """Lazy loading of moved objects in six.moves.urllib_request"""
393 _urllib_request_moved_attributes
= [
394 MovedAttribute("urlopen", "urllib2", "urllib.request"),
395 MovedAttribute("install_opener", "urllib2", "urllib.request"),
396 MovedAttribute("build_opener", "urllib2", "urllib.request"),
397 MovedAttribute("pathname2url", "urllib", "urllib.request"),
398 MovedAttribute("url2pathname", "urllib", "urllib.request"),
399 MovedAttribute("getproxies", "urllib", "urllib.request"),
400 MovedAttribute("Request", "urllib2", "urllib.request"),
401 MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
402 MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
403 MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
404 MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
405 MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
406 MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
407 MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
408 MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
409 MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
410 MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
411 MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
412 MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
413 MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
414 MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
415 MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
416 MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
417 MovedAttribute("FileHandler", "urllib2", "urllib.request"),
418 MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
419 MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
420 MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
421 MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
422 MovedAttribute("urlretrieve", "urllib", "urllib.request"),
423 MovedAttribute("urlcleanup", "urllib", "urllib.request"),
424 MovedAttribute("URLopener", "urllib", "urllib.request"),
425 MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
426 MovedAttribute("proxy_bypass", "urllib", "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
(
435 Module_six_moves_urllib_request(
437 ".moves.urllib.request"),
438 "moves.urllib_request",
439 "moves.urllib.request")
442 class Module_six_moves_urllib_response(_LazyModule
):
444 """Lazy loading of moved objects in six.moves.urllib_response"""
447 _urllib_response_moved_attributes
= [
448 MovedAttribute("addbase", "urllib", "urllib.response"),
449 MovedAttribute("addclosehook", "urllib", "urllib.response"),
450 MovedAttribute("addinfo", "urllib", "urllib.response"),
451 MovedAttribute("addinfourl", "urllib", "urllib.response"),
453 for attr
in _urllib_response_moved_attributes
:
454 setattr(Module_six_moves_urllib_response
, attr
.name
, attr
)
457 Module_six_moves_urllib_response
._moved
_attributes
= _urllib_response_moved_attributes
459 _importer
._add
_module
(
460 Module_six_moves_urllib_response(
462 ".moves.urllib.response"),
463 "moves.urllib_response",
464 "moves.urllib.response")
467 class Module_six_moves_urllib_robotparser(_LazyModule
):
469 """Lazy loading of moved objects in six.moves.urllib_robotparser"""
472 _urllib_robotparser_moved_attributes
= [
473 MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
475 for attr
in _urllib_robotparser_moved_attributes
:
476 setattr(Module_six_moves_urllib_robotparser
, attr
.name
, attr
)
479 Module_six_moves_urllib_robotparser
._moved
_attributes
= _urllib_robotparser_moved_attributes
481 _importer
._add
_module
(
482 Module_six_moves_urllib_robotparser(
483 __name__
+ ".moves.urllib.robotparser"),
484 "moves.urllib_robotparser",
485 "moves.urllib.robotparser")
488 class Module_six_moves_urllib(types
.ModuleType
):
490 """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
491 __path__
= [] # mark as package
492 parse
= _importer
._get
_module
("moves.urllib_parse")
493 error
= _importer
._get
_module
("moves.urllib_error")
494 request
= _importer
._get
_module
("moves.urllib_request")
495 response
= _importer
._get
_module
("moves.urllib_response")
496 robotparser
= _importer
._get
_module
("moves.urllib_robotparser")
499 return ['parse', 'error', 'request', 'response', 'robotparser']
501 _importer
._add
_module
(Module_six_moves_urllib(__name__
+ ".moves.urllib"),
506 """Add an item to six.moves."""
507 setattr(_MovedItems
, move
.name
, move
)
510 def remove_move(name
):
511 """Remove item from six.moves."""
513 delattr(_MovedItems
, name
)
514 except AttributeError:
516 del moves
.__dict
__[name
]
518 raise AttributeError("no such move, %r" % (name
,))
522 _meth_func
= "__func__"
523 _meth_self
= "__self__"
525 _func_closure
= "__closure__"
526 _func_code
= "__code__"
527 _func_defaults
= "__defaults__"
528 _func_globals
= "__globals__"
530 _meth_func
= "im_func"
531 _meth_self
= "im_self"
533 _func_closure
= "func_closure"
534 _func_code
= "func_code"
535 _func_defaults
= "func_defaults"
536 _func_globals
= "func_globals"
540 advance_iterator
= next
542 def advance_iterator(it
):
544 next
= advance_iterator
551 return any("__call__" in klass
.__dict
__ for klass
in type(obj
).__mro
__)
555 def get_unbound_function(unbound
):
558 create_bound_method
= types
.MethodType
560 def create_unbound_method(func
, cls
):
565 def get_unbound_function(unbound
):
566 return unbound
.im_func
568 def create_bound_method(func
, obj
):
569 return types
.MethodType(func
, obj
, obj
.__class
__)
571 def create_unbound_method(func
, cls
):
572 return types
.MethodType(func
, None, cls
)
574 class Iterator(object):
577 return type(self
).__next
__(self
)
580 _add_doc(get_unbound_function
,
581 """Get the function out of a possibly unbound function""")
584 get_method_function
= operator
.attrgetter(_meth_func
)
585 get_method_self
= operator
.attrgetter(_meth_self
)
586 get_function_closure
= operator
.attrgetter(_func_closure
)
587 get_function_code
= operator
.attrgetter(_func_code
)
588 get_function_defaults
= operator
.attrgetter(_func_defaults
)
589 get_function_globals
= operator
.attrgetter(_func_globals
)
593 def iterkeys(d
, **kw
):
594 return iter(d
.keys(**kw
))
596 def itervalues(d
, **kw
):
597 return iter(d
.values(**kw
))
599 def iteritems(d
, **kw
):
600 return iter(d
.items(**kw
))
602 def iterlists(d
, **kw
):
603 return iter(d
.lists(**kw
))
605 viewkeys
= operator
.methodcaller("keys")
607 viewvalues
= operator
.methodcaller("values")
609 viewitems
= operator
.methodcaller("items")
611 def iterkeys(d
, **kw
):
612 return d
.iterkeys(**kw
)
614 def itervalues(d
, **kw
):
615 return d
.itervalues(**kw
)
617 def iteritems(d
, **kw
):
618 return d
.iteritems(**kw
)
620 def iterlists(d
, **kw
):
621 return d
.iterlists(**kw
)
623 viewkeys
= operator
.methodcaller("viewkeys")
625 viewvalues
= operator
.methodcaller("viewvalues")
627 viewitems
= operator
.methodcaller("viewitems")
629 _add_doc(iterkeys
, "Return an iterator over the keys of a dictionary.")
630 _add_doc(itervalues
, "Return an iterator over the values of a dictionary.")
632 "Return an iterator over the (key, value) pairs of a dictionary.")
634 "Return an iterator over the (key, [values]) pairs of a dictionary.")
639 return s
.encode("latin-1")
645 int2byte
= struct
.Struct(">B").pack
647 byte2int
= operator
.itemgetter(0)
648 indexbytes
= operator
.getitem
651 StringIO
= io
.StringIO
653 _assertCountEqual
= "assertCountEqual"
654 if sys
.version_info
[1] <= 1:
655 _assertRaisesRegex
= "assertRaisesRegexp"
656 _assertRegex
= "assertRegexpMatches"
658 _assertRaisesRegex
= "assertRaisesRegex"
659 _assertRegex
= "assertRegex"
663 # Workaround for standalone backslash
666 return unicode(s
.replace(r
'\\', r
'\\\\'), "unicode_escape")
673 def indexbytes(buf
, i
):
675 iterbytes
= functools
.partial(itertools
.imap
, ord)
677 StringIO
= BytesIO
= StringIO
.StringIO
678 _assertCountEqual
= "assertItemsEqual"
679 _assertRaisesRegex
= "assertRaisesRegexp"
680 _assertRegex
= "assertRegexpMatches"
681 _add_doc(b
, """Byte literal""")
682 _add_doc(u
, """Text literal""")
685 def assertCountEqual(self
, *args
, **kwargs
):
686 return getattr(self
, _assertCountEqual
)(*args
, **kwargs
)
689 def assertRaisesRegex(self
, *args
, **kwargs
):
690 return getattr(self
, _assertRaisesRegex
)(*args
, **kwargs
)
693 def assertRegex(self
, *args
, **kwargs
):
694 return getattr(self
, _assertRegex
)(*args
, **kwargs
)
698 exec_
= getattr(moves
.builtins
, "exec")
700 def reraise(tp
, value
, tb
=None):
703 if value
.__traceback
__ is not tb
:
704 raise value
.with_traceback(tb
)
708 def exec_(_code_
, _globs_
=None, _locs_
=None):
709 """Execute code in a namespace."""
711 frame
= sys
._getframe
(1)
712 _globs_
= frame
.f_globals
714 _locs_
= frame
.f_locals
718 exec("""exec _code_ in _globs_, _locs_""")
720 exec_("""def reraise(tp, value, tb=None):
725 if sys
.version_info
[:2] == (3, 2):
726 exec_("""def raise_from(value, from_value):
727 if from_value is None:
729 raise value from from_value
731 elif sys
.version_info
[:2] > (3, 2):
732 exec_("""def raise_from(value, from_value):
733 raise value from from_value
736 def raise_from(value
, from_value
):
740 print_
= getattr(moves
.builtins
, "print", None)
742 def print_(*args
, **kwargs
):
743 """The new-style print function for Python 2.4 and 2.5."""
744 fp
= kwargs
.pop("file", sys
.stdout
)
749 if not isinstance(data
, basestring
):
751 # If the file has an encoding, encode unicode with it.
752 if (isinstance(fp
, file) and
753 isinstance(data
, unicode) and
754 fp
.encoding
is not None):
755 errors
= getattr(fp
, "errors", None)
758 data
= data
.encode(fp
.encoding
, errors
)
761 sep
= kwargs
.pop("sep", None)
763 if isinstance(sep
, unicode):
765 elif not isinstance(sep
, str):
766 raise TypeError("sep must be None or a string")
767 end
= kwargs
.pop("end", None)
769 if isinstance(end
, unicode):
771 elif not isinstance(end
, str):
772 raise TypeError("end must be None or a string")
774 raise TypeError("invalid keyword arguments to print()")
777 if isinstance(arg
, unicode):
781 newline
= unicode("\n")
790 for i
, arg
in enumerate(args
):
795 if sys
.version_info
[:2] < (3, 3):
798 def print_(*args
, **kwargs
):
799 fp
= kwargs
.get("file", sys
.stdout
)
800 flush
= kwargs
.pop("flush", False)
801 _print(*args
, **kwargs
)
802 if flush
and fp
is not None:
805 _add_doc(reraise
, """Reraise an exception.""")
807 if sys
.version_info
[0:2] < (3, 4):
808 def wraps(wrapped
, assigned
=functools
.WRAPPER_ASSIGNMENTS
,
809 updated
=functools
.WRAPPER_UPDATES
):
811 f
= functools
.wraps(wrapped
, assigned
, updated
)(f
)
812 f
.__wrapped
__ = wrapped
816 wraps
= functools
.wraps
819 def with_metaclass(meta
, *bases
):
820 """Create a base class with a metaclass."""
821 # This requires a bit of explanation: the basic idea is to make a dummy
822 # metaclass for one level of class instantiation that replaces itself with
823 # the actual metaclass.
824 class metaclass(meta
):
826 def __new__(cls
, name
, this_bases
, d
):
827 return meta(name
, bases
, d
)
828 return type.__new
__(metaclass
, 'temporary_class', (), {})
831 def add_metaclass(metaclass
):
832 """Class decorator for creating a class with a metaclass."""
834 orig_vars
= cls
.__dict
__.copy()
835 slots
= orig_vars
.get('__slots__')
836 if slots
is not None:
837 if isinstance(slots
, str):
839 for slots_var
in slots
:
840 orig_vars
.pop(slots_var
)
841 orig_vars
.pop('__dict__', None)
842 orig_vars
.pop('__weakref__', None)
843 return metaclass(cls
.__name
__, cls
.__bases
__, orig_vars
)
847 def python_2_unicode_compatible(klass
):
849 A decorator that defines __unicode__ and __str__ methods under Python 2.
850 Under Python 3 it does nothing.
852 To support Python 2 and 3 with a single code base, define a __str__ method
853 returning text and apply this decorator to the class.
856 if '__str__' not in klass
.__dict
__:
857 raise ValueError("@python_2_unicode_compatible cannot be applied "
858 "to %s because it doesn't define __str__()." %
860 klass
.__unicode
__ = klass
.__str
__
861 klass
.__str
__ = lambda self
: self
.__unicode
__().encode('utf-8')
865 # Complete the moves implementation.
866 # This code is at the end of this module to speed up module loading.
867 # Turn this module into a package.
868 __path__
= [] # required for PEP 302 and PEP 451
869 __package__
= __name__
# see PEP 366 @ReservedAssignment
870 if globals().get("__spec__") is not None:
871 __spec__
.submodule_search_locations
= [] # PEP 451 @UndefinedVariable
872 # Remove other six meta path importers, since they cause problems. This can
873 # happen if six is removed from sys.modules and then reloaded. (Setuptools does
874 # this for some reason.)
876 for i
, importer
in enumerate(sys
.meta_path
):
877 # Here's some real nastiness: Another "instance" of the six module might
878 # be floating around. Therefore, we can't use isinstance() to check for
879 # the six meta path importer, since the other six instance will have
880 # inserted an importer with different class.
881 if (type(importer
).__name
__ == "_SixMetaPathImporter" and
882 importer
.name
== __name__
):
886 # Finally, add the importer to the meta path import hook.
887 sys
.meta_path
.append(_importer
)