68 MAXSIZE = int((1 << 31) - 1)
71 MAXSIZE = int((1 << 63) - 1)
77 spec_from_loader =
None
81 """Add documentation to a function."""
86 """Import module, returning the module after the last dot."""
97 result = self._resolve()
103 except AttributeError:
133 self.
__doc__ = self.__class__.__doc__
136 attrs = [
"__doc__",
"__name__"]
141 _moved_attributes = []
146 def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
172 A meta path importer to import six.moves and its submodules.
174 This class implements a PEP302 finder and loader. It should be compatible
175 with Python 2.5 and all existing versions of Python3
183 for fullname
in fullnames:
196 return spec_from_loader(fullname, self)
199 def __get_module(self, fullname):
203 raise ImportError(
"This loader does not know module " + fullname)
221 Return true, if the named module is a package.
223 We need this method to get correct spec objects with
224 Python 3.4 (see PEP451)
231 Required, if is_package is implemented"""
234 get_source = get_code
242_importer = _SixMetaPathImporter(__name__)
247 """Lazy loading of moved objects"""
253 MovedAttribute(
"filter",
"itertools",
"builtins",
"ifilter",
"filter"),
254 MovedAttribute(
"filterfalse",
"itertools",
"itertools",
"ifilterfalse",
"filterfalse"),
255 MovedAttribute(
"input",
"__builtin__",
"builtins",
"raw_input",
"input"),
261 MovedAttribute(
"range",
"__builtin__",
"builtins",
"xrange",
"range"),
262 MovedAttribute(
"reload_module",
"__builtin__",
"importlib" if PY34
else "imp",
"reload"),
269 MovedAttribute(
"xrange",
"__builtin__",
"builtins",
"xrange",
"range"),
271 MovedAttribute(
"zip_longest",
"itertools",
"itertools",
"izip_longest",
"zip_longest"),
279 MovedModule(
"http_cookiejar",
"cookielib",
"http.cookiejar"),
280 MovedModule(
"http_cookies",
"Cookie",
"http.cookies"),
281 MovedModule(
"html_entities",
"htmlentitydefs",
"html.entities"),
282 MovedModule(
"html_parser",
"HTMLParser",
"html.parser"),
283 MovedModule(
"http_client",
"httplib",
"http.client"),
284 MovedModule(
"email_mime_base",
"email.MIMEBase",
"email.mime.base"),
285 MovedModule(
"email_mime_image",
"email.MIMEImage",
"email.mime.image"),
286 MovedModule(
"email_mime_multipart",
"email.MIMEMultipart",
"email.mime.multipart"),
287 MovedModule(
"email_mime_nonmultipart",
"email.MIMENonMultipart",
"email.mime.nonmultipart"),
288 MovedModule(
"email_mime_text",
"email.MIMEText",
"email.mime.text"),
289 MovedModule(
"BaseHTTPServer",
"BaseHTTPServer",
"http.server"),
290 MovedModule(
"CGIHTTPServer",
"CGIHTTPServer",
"http.server"),
291 MovedModule(
"SimpleHTTPServer",
"SimpleHTTPServer",
"http.server"),
298 MovedModule(
"tkinter_dialog",
"Dialog",
"tkinter.dialog"),
299 MovedModule(
"tkinter_filedialog",
"FileDialog",
"tkinter.filedialog"),
300 MovedModule(
"tkinter_scrolledtext",
"ScrolledText",
"tkinter.scrolledtext"),
301 MovedModule(
"tkinter_simpledialog",
"SimpleDialog",
"tkinter.simpledialog"),
304 MovedModule(
"tkinter_constants",
"Tkconstants",
"tkinter.constants"),
305 MovedModule(
"tkinter_dnd",
"Tkdnd",
"tkinter.dnd"),
306 MovedModule(
"tkinter_colorchooser",
"tkColorChooser",
307 "tkinter.colorchooser"),
308 MovedModule(
"tkinter_commondialog",
"tkCommonDialog",
309 "tkinter.commondialog"),
310 MovedModule(
"tkinter_tkfiledialog",
"tkFileDialog",
"tkinter.filedialog"),
311 MovedModule(
"tkinter_font",
"tkFont",
"tkinter.font"),
312 MovedModule(
"tkinter_messagebox",
"tkMessageBox",
"tkinter.messagebox"),
313 MovedModule(
"tkinter_tksimpledialog",
"tkSimpleDialog",
314 "tkinter.simpledialog"),
315 MovedModule(
"urllib_parse", __name__ +
".moves.urllib_parse",
"urllib.parse"),
316 MovedModule(
"urllib_error", __name__ +
".moves.urllib_error",
"urllib.error"),
317 MovedModule(
"urllib", __name__ +
".moves.urllib", __name__ +
".moves.urllib"),
318 MovedModule(
"urllib_robotparser",
"robotparser",
"urllib.robotparser"),
319 MovedModule(
"xmlrpc_client",
"xmlrpclib",
"xmlrpc.client"),
320 MovedModule(
"xmlrpc_server",
"SimpleXMLRPCServer",
"xmlrpc.server"),
324 _moved_attributes += [
328for attr
in _moved_attributes:
342 """Lazy loading of moved objects in six.moves.urllib_parse"""
345_urllib_parse_moved_attributes = [
346 MovedAttribute(
"ParseResult",
"urlparse",
"urllib.parse"),
347 MovedAttribute(
"SplitResult",
"urlparse",
"urllib.parse"),
348 MovedAttribute(
"parse_qs",
"urlparse",
"urllib.parse"),
349 MovedAttribute(
"parse_qsl",
"urlparse",
"urllib.parse"),
350 MovedAttribute(
"urldefrag",
"urlparse",
"urllib.parse"),
351 MovedAttribute(
"urljoin",
"urlparse",
"urllib.parse"),
352 MovedAttribute(
"urlparse",
"urlparse",
"urllib.parse"),
353 MovedAttribute(
"urlsplit",
"urlparse",
"urllib.parse"),
354 MovedAttribute(
"urlunparse",
"urlparse",
"urllib.parse"),
355 MovedAttribute(
"urlunsplit",
"urlparse",
"urllib.parse"),
356 MovedAttribute(
"quote",
"urllib",
"urllib.parse"),
357 MovedAttribute(
"quote_plus",
"urllib",
"urllib.parse"),
358 MovedAttribute(
"unquote",
"urllib",
"urllib.parse"),
359 MovedAttribute(
"unquote_plus",
"urllib",
"urllib.parse"),
360 MovedAttribute(
"unquote_to_bytes",
"urllib",
"urllib.parse",
"unquote",
"unquote_to_bytes"),
361 MovedAttribute(
"urlencode",
"urllib",
"urllib.parse"),
362 MovedAttribute(
"splitquery",
"urllib",
"urllib.parse"),
363 MovedAttribute(
"splittag",
"urllib",
"urllib.parse"),
364 MovedAttribute(
"splituser",
"urllib",
"urllib.parse"),
365 MovedAttribute(
"splitvalue",
"urllib",
"urllib.parse"),
366 MovedAttribute(
"uses_fragment",
"urlparse",
"urllib.parse"),
367 MovedAttribute(
"uses_netloc",
"urlparse",
"urllib.parse"),
368 MovedAttribute(
"uses_params",
"urlparse",
"urllib.parse"),
369 MovedAttribute(
"uses_query",
"urlparse",
"urllib.parse"),
370 MovedAttribute(
"uses_relative",
"urlparse",
"urllib.parse"),
372for attr
in _urllib_parse_moved_attributes:
379 "moves.urllib_parse",
"moves.urllib.parse")
384 """Lazy loading of moved objects in six.moves.urllib_error"""
387_urllib_error_moved_attributes = [
388 MovedAttribute("URLError", "urllib2", "urllib.error"),
389 MovedAttribute("HTTPError", "urllib2", "urllib.error"),
390 MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
392for attr in _urllib_error_moved_attributes:
393 setattr(Module_six_moves_urllib_error, attr.name, attr)
396Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
398_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
399 "moves.urllib_error", "moves.urllib.error")
402class Module_six_moves_urllib_request(_LazyModule):
404 """Lazy loading of moved objects in six.moves.urllib_request"""
407_urllib_request_moved_attributes = [
408 MovedAttribute("urlopen", "urllib2", "urllib.request"),
409 MovedAttribute("install_opener", "urllib2", "urllib.request"),
410 MovedAttribute("build_opener", "urllib2", "urllib.request"),
411 MovedAttribute("pathname2url", "urllib", "urllib.request"),
412 MovedAttribute("url2pathname", "urllib", "urllib.request"),
413 MovedAttribute("getproxies", "urllib", "urllib.request"),
414 MovedAttribute("Request", "urllib2", "urllib.request"),
415 MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
416 MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
417 MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
418 MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
419 MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
420 MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
421 MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
422 MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
423 MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
424 MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
425 MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
426 MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
427 MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
428 MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
429 MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
430 MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
431 MovedAttribute("FileHandler", "urllib2", "urllib.request"),
432 MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
433 MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
434 MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
435 MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
436 MovedAttribute("urlretrieve", "urllib", "urllib.request"),
437 MovedAttribute("urlcleanup", "urllib", "urllib.request"),
438 MovedAttribute("URLopener", "urllib", "urllib.request"),
439 MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
440 MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
441 MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
442 MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
444for attr in _urllib_request_moved_attributes:
445 setattr(Module_six_moves_urllib_request, attr.name, attr)
448Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
450_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
451 "moves.urllib_request", "moves.urllib.request")
454class Module_six_moves_urllib_response(_LazyModule):
456 """Lazy loading of moved objects in six.moves.urllib_response"""
459_urllib_response_moved_attributes = [
460 MovedAttribute("addbase", "urllib", "urllib.response"),
461 MovedAttribute("addclosehook", "urllib", "urllib.response"),
462 MovedAttribute("addinfo", "urllib", "urllib.response"),
463 MovedAttribute("addinfourl", "urllib", "urllib.response"),
465for attr in _urllib_response_moved_attributes:
466 setattr(Module_six_moves_urllib_response, attr.name, attr)
469Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
471_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
472 "moves.urllib_response", "moves.urllib.response")
475class Module_six_moves_urllib_robotparser(_LazyModule):
477 """Lazy loading of moved objects in six.moves.urllib_robotparse
r"""
480_urllib_robotparser_moved_attributes = [
481 MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
483for attr in _urllib_robotparser_moved_attributes:
484 setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
487Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
489_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
490 "moves.urllib_robotparser", "moves.urllib.robotparser")
493class Module_six_moves_urllib(types.ModuleType):
495 """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
496 __path__ = [] # mark as package
497 parse = _importer._get_module("moves.urllib_parse")
498 error = _importer._get_module("moves.urllib_error")
499 request = _importer._get_module("moves.urllib_request")
500 response = _importer._get_module("moves.urllib_response")
501 robotparser = _importer._get_module("moves.urllib_robotparser")
504 return ['parse', 'error', 'request', 'response', 'robotparser']
506_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
511 """Add an item to six.moves."""
512 setattr(_MovedItems, move.name, move)
515def remove_move(name):
516 """Remove item from six.moves."""
518 delattr(_MovedItems, name)
519 except AttributeError:
521 del moves.__dict__[name]
523 raise AttributeError("no such move, %r" % (name,))
527 _meth_func = "__func__"
528 _meth_self = "__self__"
530 _func_closure = "__closure__"
531 _func_code = "__code__"
532 _func_defaults = "__defaults__"
533 _func_globals = "__globals__"
535 _meth_func = "im_func"
536 _meth_self = "im_self"
538 _func_closure = "func_closure"
539 _func_code = "func_code"
540 _func_defaults = "func_defaults"
541 _func_globals = "func_globals"
545 advance_iterator = next
547 def advance_iterator(it):
549next = advance_iterator
556 return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
560 def get_unbound_function(unbound):
563 create_bound_method = types.MethodType
565 def create_unbound_method(func, cls):
570 def get_unbound_function(unbound):
571 return unbound.im_func
573 def create_bound_method(func, obj):
574 return types.MethodType(func, obj, obj.__class__)
576 def create_unbound_method(func, cls):
577 return types.MethodType(func, None, cls)
579 class Iterator(object):
582 return type(self).__next__(self)
585_add_doc(get_unbound_function,
586 """Get the function out of a possibly unbound function""")
589get_method_function = operator.attrgetter(_meth_func)
590get_method_self = operator.attrgetter(_meth_self)
591get_function_closure = operator.attrgetter(_func_closure)
592get_function_code = operator.attrgetter(_func_code)
593get_function_defaults = operator.attrgetter(_func_defaults)
594get_function_globals = operator.attrgetter(_func_globals)
598 def iterkeys(d, **kw):
599 return iter(d.keys(**kw))
601 def itervalues(d, **kw):
602 return iter(d.values(**kw))
604 def iteritems(d, **kw):
605 return iter(d.items(**kw))
607 def iterlists(d, **kw):
608 return iter(d.lists(**kw))
610 viewkeys = operator.methodcaller("keys")
612 viewvalues = operator.methodcaller("values")
614 viewitems = operator.methodcaller("items")
616 def iterkeys(d, **kw):
617 return d.iterkeys(**kw)
619 def itervalues(d, **kw):
620 return d.itervalues(**kw)
622 def iteritems(d, **kw):
623 return d.iteritems(**kw)
625 def iterlists(d, **kw):
626 return d.iterlists(**kw)
628 viewkeys = operator.methodcaller("viewkeys")
630 viewvalues = operator.methodcaller("viewvalues")
632 viewitems = operator.methodcaller("viewitems")
634_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
635_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
637 "Return an iterator over the (key, value) pairs of a dictionary.")
639 "Return an iterator over the (key, [values]) pairs of a dictionary.")
644 return s.encode("latin-1")
650 int2byte = struct.Struct(">B").pack
652 byte2int = operator.itemgetter(0)
653 indexbytes = operator.getitem
656 StringIO = io.StringIO
659 _assertCountEqual = "assertCountEqual"
660 if sys.version_info[1] <= 1:
661 _assertRaisesRegex = "assertRaisesRegexp"
662 _assertRegex = "assertRegexpMatches"
663 _assertNotRegex = "assertNotRegexpMatches"
665 _assertRaisesRegex = "assertRaisesRegex"
666 _assertRegex = "assertRegex"
667 _assertNotRegex = "assertNotRegex"
671 # Workaround for standalone backslash
674 return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
681 def indexbytes(buf, i):
683 iterbytes = functools.partial(itertools.imap, ord)
685 StringIO = BytesIO = StringIO.StringIO
686 _assertCountEqual = "assertItemsEqual"
687 _assertRaisesRegex = "assertRaisesRegexp"
688 _assertRegex = "assertRegexpMatches"
689 _assertNotRegex = "assertNotRegexpMatches"
690_add_doc(b, """Byte literal""")
691_add_doc(u, """Text literal""")
694def assertCountEqual(self, *args, **kwargs):
695 return getattr(self, _assertCountEqual)(*args, **kwargs)
698def assertRaisesRegex(self, *args, **kwargs):
699 return getattr(self, _assertRaisesRegex)(*args, **kwargs)
702def assertRegex(self, *args, **kwargs):
703 return getattr(self, _assertRegex)(*args, **kwargs)
706def assertNotRegex(self, *args, **kwargs):
707 return getattr(self, _assertNotRegex)(*args, **kwargs)
711 exec_ = getattr(moves.builtins, "exec")
713 def reraise(tp, value, tb=None):
717 if value.__traceback__ is not tb:
718 raise value.with_traceback(tb)
725 def exec_(_code_, _globs_=None, _locs_=None):
726 """Execute code in a namespace."""
728 frame = sys._getframe(1)
729 _globs_ = frame.f_globals
731 _locs_ = frame.f_locals
735 exec("""exec _code_ in _globs_, _locs_""")
737 exec_("""def reraise(tp, value, tb=None):
745if sys.version_info[:2] > (3,):
746 exec_("""def raise_from(value, from_value):
748 raise value from from_value
753 def raise_from(value, from_value):
757print_ = getattr(moves.builtins, "print", None)
759 def print_(*args, **kwargs):
760 """The new-style print function for Python 2.4 and 2.5."""
761 fp = kwargs.pop("file", sys.stdout)
766 if not isinstance(data, basestring):
768 # If the file has an encoding, encode unicode with it.
769 if (isinstance(fp, file) and
770 isinstance(data, unicode) and
771 fp.encoding is not None):
772 errors = getattr(fp, "errors", None)
775 data = data.encode(fp.encoding, errors)
778 sep = kwargs.pop("sep", None)
780 if isinstance(sep, unicode):
782 elif not isinstance(sep, str):
783 raise TypeError("sep must be None or a string")
784 end = kwargs.pop("end", None)
786 if isinstance(end, unicode):
788 elif not isinstance(end, str):
789 raise TypeError("end must be None or a string")
791 raise TypeError("invalid keyword arguments to print()")
794 if isinstance(arg, unicode):
798 newline = unicode("\n")
807 for i, arg in enumerate(args):
812if sys.version_info[:2] < (3, 3):
815 def print_(*args, **kwargs):
816 fp = kwargs.get("file", sys.stdout)
817 flush = kwargs.pop("flush", False)
818 _print(*args, **kwargs)
819 if flush and fp is not None:
822_add_doc(reraise, """Reraise an exception.""")
824if sys.version_info[0:2] < (3, 4):
825 # This does exactly the same what the :func:`py3:functools.update_wrapper`
826 # function does on Python versions after 3.2. It sets the ``__wrapped__``
827 # attribute on ``wrapper`` object and it doesn't raise an error if any of
828 # the attributes mentioned in ``assigned`` and ``updated`` are missing on
829 # ``wrapped`` object.
830 def _update_wrapper(wrapper, wrapped,
831 assigned=functools.WRAPPER_ASSIGNMENTS,
832 updated=functools.WRAPPER_UPDATES):
833 for attr in assigned:
835 value = getattr(wrapped, attr)
836 except AttributeError:
839 setattr(wrapper, attr, value)
841 getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
842 wrapper.__wrapped__ = wrapped
844 _update_wrapper.__doc__ = functools.update_wrapper.__doc__
846 def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
847 updated=functools.WRAPPER_UPDATES):
848 return functools.partial(_update_wrapper, wrapped=wrapped,
849 assigned=assigned, updated=updated)
850 wraps.__doc__ = functools.wraps.__doc__
853 wraps = functools.wraps
856def with_metaclass(meta, *bases):
857 """Create a base class with a metaclass."""
858 # This requires a bit of explanation: the basic idea is to make a dummy
859 # metaclass for one level of class instantiation that replaces itself with
860 # the actual metaclass.
861 class metaclass(type):
863 def __new__(cls, name, this_bases, d):
864 if sys.version_info[:2] >= (3, 7):
865 # This version introduced PEP 560 that requires a bit
866 # of extra care (we mimic what is done by __build_class__).
867 resolved_bases = types.resolve_bases(bases)
868 if resolved_bases is not bases:
869 d['__orig_bases__'] = bases
871 resolved_bases = bases
872 return meta(name, resolved_bases, d)
875 def __prepare__(cls, name, this_bases):
876 return meta.__prepare__(name, bases)
877 return type.__new__(metaclass, 'temporary_class', (), {})
880def add_metaclass(metaclass):
881 """Class decorator for creating a class with a metaclass."""
883 orig_vars = cls.__dict__.copy()
884 slots = orig_vars.get('__slots__')
885 if slots is not None:
886 if isinstance(slots, str):
888 for slots_var in slots:
889 orig_vars.pop(slots_var)
890 orig_vars.pop('__dict__', None)
891 orig_vars.pop('__weakref__', None)
892 if hasattr(cls, '__qualname__'):
893 orig_vars['__qualname__'] = cls.__qualname__
894 return metaclass(cls.__name__, cls.__bases__, orig_vars)
898def ensure_binary(s, encoding='utf-8', errors='strict'):
899 """Coerce **s** to six.binary_type.
902 - `unicode` -> encoded to `str`
906 - `str` -> encoded to `bytes`
909 if isinstance(s, binary_type):
911 if isinstance(s, text_type):
912 return s.encode(encoding, errors)
913 raise TypeError("not expecting type '%s'" % type(s))
916def ensure_str(s, encoding='utf-8', errors='strict'):
917 """Coerce *s* to `str`.
920 - `unicode` -> encoded to `str`
925 - `bytes` -> decoded to `str`
927 # Optimization: Fast return for the common case.
930 if PY2 and isinstance(s, text_type):
931 return s.encode(encoding, errors)
932 elif PY3 and isinstance(s, binary_type):
933 return s.decode(encoding, errors)
934 elif not isinstance(s, (text_type, binary_type)):
935 raise TypeError("not expecting type '%s'" % type(s))
939def ensure_text(s, encoding='utf-8', errors='strict'):
940 """Coerce *s* to six.text_type.
943 - `unicode` -> `unicode`
948 - `bytes` -> decoded to `str`
950 if isinstance(s, binary_type):
951 return s.decode(encoding, errors)
952 elif isinstance(s, text_type):
955 raise TypeError("not expecting type '%s'" % type(s))
958def python_2_unicode_compatible(klass):
960 A class decorator that defines __unicode__ and __str__ methods under Python 2.
961 Under Python 3 it does nothing.
963 To support Python 2 and 3 with a single code base, define a __str__ method
964 returning text and apply this decorator to the class.
967 if '__str__' not in klass.__dict__:
968 raise ValueError("@python_2_unicode_compatible cannot be applied "
969 "to %s because it doesn't define __str__()." %
971 klass.__unicode__ = klass.__str__
972 klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
976# Complete the moves implementation.
977# This code is at the end of this module to speed up module loading.
978# Turn this module into a package.
979__path__ = [] # required for PEP 302 and PEP 451
980__package__ = __name__ # see PEP 366 @ReservedAssignment
981if globals().get("__spec__") is not None:
982 __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
983# Remove other six meta path importers, since they cause problems. This can
984# happen if six is removed from sys.modules and then reloaded. (Setuptools does
985# this for some reason.)
987 for i, importer in enumerate(sys.meta_path):
988 # Here's some real nastiness: Another "instance" of the six module might
989 # be floating around. Therefore, we can't use isinstance() to check for
990 # the six meta path importer, since the other six instance will have
991 # inserted an importer with different class.
992 if (type(importer).__name__ == "_SixMetaPathImporter" and
993 importer.name == __name__):
997# Finally, add the importer to the meta path import hook.
998sys.meta_path.append(_importer)