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(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
357
"moves.urllib_parse", "moves.urllib.parse")
360
class Module_six_moves_urllib_error(_LazyModule):
362
"""Lazy loading of moved objects in six.moves.urllib_error"""
365
_urllib_error_moved_attributes = [
366
MovedAttribute("URLError", "urllib2", "urllib.error"),
367
MovedAttribute("HTTPError", "urllib2", "urllib.error"),
368
MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
370
for attr in _urllib_error_moved_attributes:
371
setattr(Module_six_moves_urllib_error, attr.name, attr)
374
Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
376
_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
377
"moves.urllib_error", "moves.urllib.error")
380
class Module_six_moves_urllib_request(_LazyModule):
382
"""Lazy loading of moved objects in six.moves.urllib_request"""
385
_urllib_request_moved_attributes = [
386
MovedAttribute("urlopen", "urllib2", "urllib.request"),
387
MovedAttribute("install_opener", "urllib2", "urllib.request"),
388
MovedAttribute("build_opener", "urllib2", "urllib.request"),
389
MovedAttribute("pathname2url", "urllib", "urllib.request"),
390
MovedAttribute("url2pathname", "urllib", "urllib.request"),
391
MovedAttribute("getproxies", "urllib", "urllib.request"),
392
MovedAttribute("Request", "urllib2", "urllib.request"),
393
MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
394
MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
395
MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
396
MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
397
MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
398
MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
399
MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
400
MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
401
MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
402
MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
403
MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
404
MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
405
MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
406
MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
407
MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
408
MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
409
MovedAttribute("FileHandler", "urllib2", "urllib.request"),
410
MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
411
MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
412
MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
413
MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
414
MovedAttribute("urlretrieve", "urllib", "urllib.request"),
415
MovedAttribute("urlcleanup", "urllib", "urllib.request"),
416
MovedAttribute("URLopener", "urllib", "urllib.request"),
417
MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
418
MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
420
for attr in _urllib_request_moved_attributes:
421
setattr(Module_six_moves_urllib_request, attr.name, attr)
424
Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
426
_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
427
"moves.urllib_request", "moves.urllib.request")
430
class Module_six_moves_urllib_response(_LazyModule):
432
"""Lazy loading of moved objects in six.moves.urllib_response"""
435
_urllib_response_moved_attributes = [
436
MovedAttribute("addbase", "urllib", "urllib.response"),
437
MovedAttribute("addclosehook", "urllib", "urllib.response"),
438
MovedAttribute("addinfo", "urllib", "urllib.response"),
439
MovedAttribute("addinfourl", "urllib", "urllib.response"),
441
for attr in _urllib_response_moved_attributes:
442
setattr(Module_six_moves_urllib_response, attr.name, attr)
445
Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
447
_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
448
"moves.urllib_response", "moves.urllib.response")
451
class Module_six_moves_urllib_robotparser(_LazyModule):
453
"""Lazy loading of moved objects in six.moves.urllib_robotparser"""
456
_urllib_robotparser_moved_attributes = [
457
MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
459
for attr in _urllib_robotparser_moved_attributes:
460
setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
463
Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
465
_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
466
"moves.urllib_robotparser", "moves.urllib.robotparser")
469
class Module_six_moves_urllib(types.ModuleType):
471
"""Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
472
__path__ = [] # mark as package
473
parse = _importer._get_module("moves.urllib_parse")
474
error = _importer._get_module("moves.urllib_error")
475
request = _importer._get_module("moves.urllib_request")
476
response = _importer._get_module("moves.urllib_response")
477
robotparser = _importer._get_module("moves.urllib_robotparser")
480
return ['parse', 'error', 'request', 'response', 'robotparser']
482
_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
487
"""Add an item to six.moves."""
488
setattr(_MovedItems, move.name, move)
491
def remove_move(name):
492
"""Remove item from six.moves."""
494
delattr(_MovedItems, name)
495
except AttributeError:
497
del moves.__dict__[name]
499
raise AttributeError("no such move, %r" % (name,))
503
_meth_func = "__func__"
504
_meth_self = "__self__"
506
_func_closure = "__closure__"
507
_func_code = "__code__"
508
_func_defaults = "__defaults__"
509
_func_globals = "__globals__"
511
_meth_func = "im_func"
512
_meth_self = "im_self"
514
_func_closure = "func_closure"
515
_func_code = "func_code"
516
_func_defaults = "func_defaults"
517
_func_globals = "func_globals"
521
advance_iterator = next
523
def advance_iterator(it):
525
next = advance_iterator
532
return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
536
def get_unbound_function(unbound):
539
create_bound_method = types.MethodType
541
def create_unbound_method(func, cls):
546
def get_unbound_function(unbound):
547
return unbound.im_func
549
def create_bound_method(func, obj):
550
return types.MethodType(func, obj, obj.__class__)
552
def create_unbound_method(func, cls):
553
return types.MethodType(func, None, cls)
555
class Iterator(object):
558
return type(self).__next__(self)
561
_add_doc(get_unbound_function,
562
"""Get the function out of a possibly unbound function""")
565
get_method_function = operator.attrgetter(_meth_func)
566
get_method_self = operator.attrgetter(_meth_self)
567
get_function_closure = operator.attrgetter(_func_closure)
568
get_function_code = operator.attrgetter(_func_code)
569
get_function_defaults = operator.attrgetter(_func_defaults)
570
get_function_globals = operator.attrgetter(_func_globals)
574
def iterkeys(d, **kw):
575
return iter(d.keys(**kw))
577
def itervalues(d, **kw):
578
return iter(d.values(**kw))
580
def iteritems(d, **kw):
581
return iter(d.items(**kw))
583
def iterlists(d, **kw):
584
return iter(d.lists(**kw))
586
viewkeys = operator.methodcaller("keys")
588
viewvalues = operator.methodcaller("values")
590
viewitems = operator.methodcaller("items")
592
def iterkeys(d, **kw):
593
return d.iterkeys(**kw)
595
def itervalues(d, **kw):
596
return d.itervalues(**kw)
598
def iteritems(d, **kw):
599
return d.iteritems(**kw)
601
def iterlists(d, **kw):
602
return d.iterlists(**kw)
604
viewkeys = operator.methodcaller("viewkeys")
606
viewvalues = operator.methodcaller("viewvalues")
608
viewitems = operator.methodcaller("viewitems")
610
_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
611
_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
613
"Return an iterator over the (key, value) pairs of a dictionary.")
615
"Return an iterator over the (key, [values]) pairs of a dictionary.")
620
return s.encode("latin-1")
626
int2byte = struct.Struct(">B").pack
628
byte2int = operator.itemgetter(0)
629
indexbytes = operator.getitem
632
StringIO = io.StringIO
634
_assertCountEqual = "assertCountEqual"
635
if sys.version_info[1] <= 1:
636
_assertRaisesRegex = "assertRaisesRegexp"
637
_assertRegex = "assertRegexpMatches"
639
_assertRaisesRegex = "assertRaisesRegex"
640
_assertRegex = "assertRegex"
644
# Workaround for standalone backslash
647
return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
654
def indexbytes(buf, i):
656
iterbytes = functools.partial(itertools.imap, ord)
658
StringIO = BytesIO = StringIO.StringIO
659
_assertCountEqual = "assertItemsEqual"
660
_assertRaisesRegex = "assertRaisesRegexp"
661
_assertRegex = "assertRegexpMatches"
662
_add_doc(b, """Byte literal""")
663
_add_doc(u, """Text literal""")
666
def assertCountEqual(self, *args, **kwargs):
667
return getattr(self, _assertCountEqual)(*args, **kwargs)
670
def assertRaisesRegex(self, *args, **kwargs):
671
return getattr(self, _assertRaisesRegex)(*args, **kwargs)
674
def assertRegex(self, *args, **kwargs):
675
return getattr(self, _assertRegex)(*args, **kwargs)
679
exec_ = getattr(moves.builtins, "exec")
681
def reraise(tp, value, tb=None):
684
if value.__traceback__ is not tb:
685
raise value.with_traceback(tb)
689
def exec_(_code_, _globs_=None, _locs_=None):
690
"""Execute code in a namespace."""
692
frame = sys._getframe(1)
693
_globs_ = frame.f_globals
695
_locs_ = frame.f_locals
699
exec("""exec _code_ in _globs_, _locs_""")
701
exec_("""def reraise(tp, value, tb=None):
706
if sys.version_info[:2] == (3, 2):
707
exec_("""def raise_from(value, from_value):
708
if from_value is None:
710
raise value from from_value
712
elif sys.version_info[:2] > (3, 2):
713
exec_("""def raise_from(value, from_value):
714
raise value from from_value
717
def raise_from(value, from_value):
721
print_ = getattr(moves.builtins, "print", None)
723
def print_(*args, **kwargs):
724
"""The new-style print function for Python 2.4 and 2.5."""
725
fp = kwargs.pop("file", sys.stdout)
730
if not isinstance(data, basestring):
732
# If the file has an encoding, encode unicode with it.
733
if (isinstance(fp, file) and
734
isinstance(data, unicode) and
735
fp.encoding is not None):
736
errors = getattr(fp, "errors", None)
739
data = data.encode(fp.encoding, errors)
742
sep = kwargs.pop("sep", None)
744
if isinstance(sep, unicode):
746
elif not isinstance(sep, str):
747
raise TypeError("sep must be None or a string")
748
end = kwargs.pop("end", None)
750
if isinstance(end, unicode):
752
elif not isinstance(end, str):
753
raise TypeError("end must be None or a string")
755
raise TypeError("invalid keyword arguments to print()")
758
if isinstance(arg, unicode):
762
newline = unicode("\n")
771
for i, arg in enumerate(args):
776
if sys.version_info[:2] < (3, 3):
779
def print_(*args, **kwargs):
780
fp = kwargs.get("file", sys.stdout)
781
flush = kwargs.pop("flush", False)
782
_print(*args, **kwargs)
783
if flush and fp is not None:
786
_add_doc(reraise, """Reraise an exception.""")
788
if sys.version_info[0:2] < (3, 4):
789
def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
790
updated=functools.WRAPPER_UPDATES):
792
f = functools.wraps(wrapped, assigned, updated)(f)
793
f.__wrapped__ = wrapped
797
wraps = functools.wraps
800
def with_metaclass(meta, *bases):
801
"""Create a base class with a metaclass."""
802
# This requires a bit of explanation: the basic idea is to make a dummy
803
# metaclass for one level of class instantiation that replaces itself with
804
# the actual metaclass.
805
class metaclass(meta):
807
def __new__(cls, name, this_bases, d):
808
return meta(name, bases, d)
809
return type.__new__(metaclass, 'temporary_class', (), {})
812
def add_metaclass(metaclass):
813
"""Class decorator for creating a class with a metaclass."""
815
orig_vars = cls.__dict__.copy()
816
slots = orig_vars.get('__slots__')
817
if slots is not None:
818
if isinstance(slots, str):
820
for slots_var in slots:
821
orig_vars.pop(slots_var)
822
orig_vars.pop('__dict__', None)
823
orig_vars.pop('__weakref__', None)
824
return metaclass(cls.__name__, cls.__bases__, orig_vars)
828
def python_2_unicode_compatible(klass):
830
A decorator that defines __unicode__ and __str__ methods under Python 2.
831
Under Python 3 it does nothing.
833
To support Python 2 and 3 with a single code base, define a __str__ method
834
returning text and apply this decorator to the class.
837
if '__str__' not in klass.__dict__:
838
raise ValueError("@python_2_unicode_compatible cannot be applied "
839
"to %s because it doesn't define __str__()." %
841
klass.__unicode__ = klass.__str__
842
klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
846
# Complete the moves implementation.
847
# This code is at the end of this module to speed up module loading.
848
# Turn this module into a package.
849
__path__ = [] # required for PEP 302 and PEP 451
850
__package__ = __name__ # see PEP 366 @ReservedAssignment
851
if globals().get("__spec__") is not None:
852
__spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
853
# Remove other six meta path importers, since they cause problems. This can
854
# happen if six is removed from sys.modules and then reloaded. (Setuptools does
855
# this for some reason.)
857
for i, importer in enumerate(sys.meta_path):
858
# Here's some real nastiness: Another "instance" of the six module might
859
# be floating around. Therefore, we can't use isinstance() to check for
860
# the six meta path importer, since the other six instance will have
861
# inserted an importer with different class.
862
if (type(importer).__name__ == "_SixMetaPathImporter" and
863
importer.name == __name__):
867
# Finally, add the importer to the meta path import hook.
868
sys.meta_path.append(_importer)