# Copyright (c) 2010-2018 Benjamin Peterson## Permission is hereby granted, free of charge, to any person obtaining a copy# of this software and associated documentation files (the "Software"), to deal# in the Software without restriction, including without limitation the rights# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell# copies of the Software, and to permit persons to whom the Software is# furnished to do so, subject to the following conditions:## The above copyright notice and this permission notice shall be included in all# copies or substantial portions of the Software.## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE# SOFTWARE."""Utilities for writing code that runs on Python 2 and 3"""from__future__importabsolute_importimportfunctoolsimportitertoolsimportoperatorimportsysimporttypes__author__="Benjamin Peterson <benjamin@python.org>"__version__="1.12.0"# Useful for very coarse version differentiation.PY2=sys.version_info[0]==2PY3=sys.version_info[0]==3PY34=sys.version_info[0:2]>=(3,4)ifPY3:string_types=str,integer_types=int,class_types=type,text_type=strbinary_type=bytesMAXSIZE=sys.maxsizeelse:string_types=basestring,integer_types=(int,long)class_types=(type,types.ClassType)text_type=unicodebinary_type=strifsys.platform.startswith("java"):# Jython always uses 32 bits.MAXSIZE=int((1<<31)-1)else:# It's possible to have sizeof(long) != sizeof(Py_ssize_t).classX(object):def__len__(self):return1<<31try:len(X())exceptOverflowError:# 32-bitMAXSIZE=int((1<<31)-1)else:# 64-bitMAXSIZE=int((1<<63)-1)delXdef_add_doc(func,doc):"""Add documentation to a function."""func.__doc__=docdef_import_module(name):"""Import module, returning the module after the last dot."""__import__(name)returnsys.modules[name]class_LazyDescr(object):def__init__(self,name):self.name=namedef__get__(self,obj,tp):result=self._resolve()setattr(obj,self.name,result)# Invokes __set__.try:# This is a bit ugly, but it avoids running this again by# removing this descriptor.delattr(obj.__class__,self.name)exceptAttributeError:passreturnresultclassMovedModule(_LazyDescr):def__init__(self,name,old,new=None):super(MovedModule,self).__init__(name)ifPY3:ifnewisNone:new=nameself.mod=newelse:self.mod=olddef_resolve(self):return_import_module(self.mod)def__getattr__(self,attr):_module=self._resolve()value=getattr(_module,attr)setattr(self,attr,value)returnvalueclass_LazyModule(types.ModuleType):def__init__(self,name):super(_LazyModule,self).__init__(name)self.__doc__=self.__class__.__doc__def__dir__(self):attrs=["__doc__","__name__"]attrs+=[attr.nameforattrinself._moved_attributes]returnattrs# Subclasses should override this_moved_attributes=[]classMovedAttribute(_LazyDescr):def__init__(self,name,old_mod,new_mod,old_attr=None,new_attr=None):super(MovedAttribute,self).__init__(name)ifPY3:ifnew_modisNone:new_mod=nameself.mod=new_modifnew_attrisNone:ifold_attrisNone:new_attr=nameelse:new_attr=old_attrself.attr=new_attrelse:self.mod=old_modifold_attrisNone:old_attr=nameself.attr=old_attrdef_resolve(self):module=_import_module(self.mod)returngetattr(module,self.attr)class_SixMetaPathImporter(object):""" A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 """def__init__(self,six_module_name):self.name=six_module_nameself.known_modules={}def_add_module(self,mod,*fullnames):forfullnameinfullnames:self.known_modules[self.name+"."+fullname]=moddef_get_module(self,fullname):returnself.known_modules[self.name+"."+fullname]deffind_module(self,fullname,path=None):iffullnameinself.known_modules:returnselfreturnNonedef__get_module(self,fullname):try:returnself.known_modules[fullname]exceptKeyError:raiseImportError("This loader does not know module "+fullname)defload_module(self,fullname):try:# in case of a reloadreturnsys.modules[fullname]exceptKeyError:passmod=self.__get_module(fullname)ifisinstance(mod,MovedModule):mod=mod._resolve()else:mod.__loader__=selfsys.modules[fullname]=modreturnmoddefis_package(self,fullname):""" Return true, if the named module is a package. We need this method to get correct spec objects with Python 3.4 (see PEP451) """returnhasattr(self.__get_module(fullname),"__path__")defget_code(self,fullname):"""Return None Required, if is_package is implemented"""self.__get_module(fullname)# eventually raises ImportErrorreturnNoneget_source=get_code# same as get_code_importer=_SixMetaPathImporter(__name__)class_MovedItems(_LazyModule):"""Lazy loading of moved objects"""__path__=[]# mark as package_moved_attributes=[MovedAttribute("cStringIO","cStringIO","io","StringIO"),MovedAttribute("filter","itertools","builtins","ifilter","filter"),MovedAttribute("filterfalse","itertools","itertools","ifilterfalse","filterfalse"),MovedAttribute("input","__builtin__","builtins","raw_input","input"),MovedAttribute("intern","__builtin__","sys"),MovedAttribute("map","itertools","builtins","imap","map"),MovedAttribute("getcwd","os","os","getcwdu","getcwd"),MovedAttribute("getcwdb","os","os","getcwd","getcwdb"),MovedAttribute("getoutput","commands","subprocess"),MovedAttribute("range","__builtin__","builtins","xrange","range"),MovedAttribute("reload_module","__builtin__","importlib"ifPY34else"imp","reload"),MovedAttribute("reduce","__builtin__","functools"),MovedAttribute("shlex_quote","pipes","shlex","quote"),MovedAttribute("StringIO","StringIO","io"),MovedAttribute("UserDict","UserDict","collections"),MovedAttribute("UserList","UserList","collections"),MovedAttribute("UserString","UserString","collections"),MovedAttribute("xrange","__builtin__","builtins","xrange","range"),MovedAttribute("zip","itertools","builtins","izip","zip"),MovedAttribute("zip_longest","itertools","itertools","izip_longest","zip_longest"),MovedModule("builtins","__builtin__"),MovedModule("configparser","ConfigParser"),MovedModule("copyreg","copy_reg"),MovedModule("dbm_gnu","gdbm","dbm.gnu"),MovedModule("_dummy_thread","dummy_thread","_dummy_thread"),MovedModule("http_cookiejar","cookielib","http.cookiejar"),MovedModule("http_cookies","Cookie","http.cookies"),MovedModule("html_entities","htmlentitydefs","html.entities"),MovedModule("html_parser","HTMLParser","html.parser"),MovedModule("http_client","httplib","http.client"),MovedModule("email_mime_base","email.MIMEBase","email.mime.base"),MovedModule("email_mime_image","email.MIMEImage","email.mime.image"),MovedModule("email_mime_multipart","email.MIMEMultipart","email.mime.multipart"),MovedModule("email_mime_nonmultipart","email.MIMENonMultipart","email.mime.nonmultipart"),MovedModule("email_mime_text","email.MIMEText","email.mime.text"),MovedModule("BaseHTTPServer","BaseHTTPServer","http.server"),MovedModule("CGIHTTPServer","CGIHTTPServer","http.server"),MovedModule("SimpleHTTPServer","SimpleHTTPServer","http.server"),MovedModule("cPickle","cPickle","pickle"),MovedModule("queue","Queue"),MovedModule("reprlib","repr"),MovedModule("socketserver","SocketServer"),MovedModule("_thread","thread","_thread"),MovedModule("tkinter","Tkinter"),MovedModule("tkinter_dialog","Dialog","tkinter.dialog"),MovedModule("tkinter_filedialog","FileDialog","tkinter.filedialog"),MovedModule("tkinter_scrolledtext","ScrolledText","tkinter.scrolledtext"),MovedModule("tkinter_simpledialog","SimpleDialog","tkinter.simpledialog"),MovedModule("tkinter_tix","Tix","tkinter.tix"),MovedModule("tkinter_ttk","ttk","tkinter.ttk"),MovedModule("tkinter_constants","Tkconstants","tkinter.constants"),MovedModule("tkinter_dnd","Tkdnd","tkinter.dnd"),MovedModule("tkinter_colorchooser","tkColorChooser","tkinter.colorchooser"),MovedModule("tkinter_commondialog","tkCommonDialog","tkinter.commondialog"),MovedModule("tkinter_tkfiledialog","tkFileDialog","tkinter.filedialog"),MovedModule("tkinter_font","tkFont","tkinter.font"),MovedModule("tkinter_messagebox","tkMessageBox","tkinter.messagebox"),MovedModule("tkinter_tksimpledialog","tkSimpleDialog","tkinter.simpledialog"),MovedModule("urllib_parse",__name__+".moves.urllib_parse","urllib.parse"),MovedModule("urllib_error",__name__+".moves.urllib_error","urllib.error"),MovedModule("urllib",__name__+".moves.urllib",__name__+".moves.urllib"),MovedModule("urllib_robotparser","robotparser","urllib.robotparser"),MovedModule("xmlrpc_client","xmlrpclib","xmlrpc.client"),MovedModule("xmlrpc_server","SimpleXMLRPCServer","xmlrpc.server"),]# Add windows specific modules.ifsys.platform=="win32":_moved_attributes+=[MovedModule("winreg","_winreg"),]forattrin_moved_attributes:setattr(_MovedItems,attr.name,attr)ifisinstance(attr,MovedModule):_importer._add_module(attr,"moves."+attr.name)delattr_MovedItems._moved_attributes=_moved_attributesmoves=_MovedItems(__name__+".moves")_importer._add_module(moves,"moves")classModule_six_moves_urllib_parse(_LazyModule):"""Lazy loading of moved objects in six.moves.urllib_parse"""_urllib_parse_moved_attributes=[MovedAttribute("ParseResult","urlparse","urllib.parse"),MovedAttribute("SplitResult","urlparse","urllib.parse"),MovedAttribute("parse_qs","urlparse","urllib.parse"),MovedAttribute("parse_qsl","urlparse","urllib.parse"),MovedAttribute("urldefrag","urlparse","urllib.parse"),MovedAttribute("urljoin","urlparse","urllib.parse"),MovedAttribute("urlparse","urlparse","urllib.parse"),MovedAttribute("urlsplit","urlparse","urllib.parse"),MovedAttribute("urlunparse","urlparse","urllib.parse"),MovedAttribute("urlunsplit","urlparse","urllib.parse"),MovedAttribute("quote","urllib","urllib.parse"),MovedAttribute("quote_plus","urllib","urllib.parse"),MovedAttribute("unquote","urllib","urllib.parse"),MovedAttribute("unquote_plus","urllib","urllib.parse"),MovedAttribute("unquote_to_bytes","urllib","urllib.parse","unquote","unquote_to_bytes"),MovedAttribute("urlencode","urllib","urllib.parse"),MovedAttribute("splitquery","urllib","urllib.parse"),MovedAttribute("splittag","urllib","urllib.parse"),MovedAttribute("splituser","urllib","urllib.parse"),MovedAttribute("splitvalue","urllib","urllib.parse"),MovedAttribute("uses_fragment","urlparse","urllib.parse"),MovedAttribute("uses_netloc","urlparse","urllib.parse"),MovedAttribute("uses_params","urlparse","urllib.parse"),MovedAttribute("uses_query","urlparse","urllib.parse"),MovedAttribute("uses_relative","urlparse","urllib.parse"),]forattrin_urllib_parse_moved_attributes:setattr(Module_six_moves_urllib_parse,attr.name,attr)delattrModule_six_moves_urllib_parse._moved_attributes=_urllib_parse_moved_attributes_importer._add_module(Module_six_moves_urllib_parse(__name__+".moves.urllib_parse"),"moves.urllib_parse","moves.urllib.parse")classModule_six_moves_urllib_error(_LazyModule):"""Lazy loading of moved objects in six.moves.urllib_error"""_urllib_error_moved_attributes=[MovedAttribute("URLError","urllib2","urllib.error"),MovedAttribute("HTTPError","urllib2","urllib.error"),MovedAttribute("ContentTooShortError","urllib","urllib.error"),]forattrin_urllib_error_moved_attributes:setattr(Module_six_moves_urllib_error,attr.name,attr)delattrModule_six_moves_urllib_error._moved_attributes=_urllib_error_moved_attributes_importer._add_module(Module_six_moves_urllib_error(__name__+".moves.urllib.error"),"moves.urllib_error","moves.urllib.error")classModule_six_moves_urllib_request(_LazyModule):"""Lazy loading of moved objects in six.moves.urllib_request"""_urllib_request_moved_attributes=[MovedAttribute("urlopen","urllib2","urllib.request"),MovedAttribute("install_opener","urllib2","urllib.request"),MovedAttribute("build_opener","urllib2","urllib.request"),MovedAttribute("pathname2url","urllib","urllib.request"),MovedAttribute("url2pathname","urllib","urllib.request"),MovedAttribute("getproxies","urllib","urllib.request"),MovedAttribute("Request","urllib2","urllib.request"),MovedAttribute("OpenerDirector","urllib2","urllib.request"),MovedAttribute("HTTPDefaultErrorHandler","urllib2","urllib.request"),MovedAttribute("HTTPRedirectHandler","urllib2","urllib.request"),MovedAttribute("HTTPCookieProcessor","urllib2","urllib.request"),MovedAttribute("ProxyHandler","urllib2","urllib.request"),MovedAttribute("BaseHandler","urllib2","urllib.request"),MovedAttribute("HTTPPasswordMgr","urllib2","urllib.request"),MovedAttribute("HTTPPasswordMgrWithDefaultRealm","urllib2","urllib.request"),MovedAttribute("AbstractBasicAuthHandler","urllib2","urllib.request"),MovedAttribute("HTTPBasicAuthHandler","urllib2","urllib.request"),MovedAttribute("ProxyBasicAuthHandler","urllib2","urllib.request"),MovedAttribute("AbstractDigestAuthHandler","urllib2","urllib.request"),MovedAttribute("HTTPDigestAuthHandler","urllib2","urllib.request"),MovedAttribute("ProxyDigestAuthHandler","urllib2","urllib.request"),MovedAttribute("HTTPHandler","urllib2","urllib.request"),MovedAttribute("HTTPSHandler","urllib2","urllib.request"),MovedAttribute("FileHandler","urllib2","urllib.request"),MovedAttribute("FTPHandler","urllib2","urllib.request"),MovedAttribute("CacheFTPHandler","urllib2","urllib.request"),MovedAttribute("UnknownHandler","urllib2","urllib.request"),MovedAttribute("HTTPErrorProcessor","urllib2","urllib.request"),MovedAttribute("urlretrieve","urllib","urllib.request"),MovedAttribute("urlcleanup","urllib","urllib.request"),MovedAttribute("URLopener","urllib","urllib.request"),MovedAttribute("FancyURLopener","urllib","urllib.request"),MovedAttribute("proxy_bypass","urllib","urllib.request"),MovedAttribute("parse_http_list","urllib2","urllib.request"),MovedAttribute("parse_keqv_list","urllib2","urllib.request"),]forattrin_urllib_request_moved_attributes:setattr(Module_six_moves_urllib_request,attr.name,attr)delattrModule_six_moves_urllib_request._moved_attributes=_urllib_request_moved_attributes_importer._add_module(Module_six_moves_urllib_request(__name__+".moves.urllib.request"),"moves.urllib_request","moves.urllib.request")classModule_six_moves_urllib_response(_LazyModule):"""Lazy loading of moved objects in six.moves.urllib_response"""_urllib_response_moved_attributes=[MovedAttribute("addbase","urllib","urllib.response"),MovedAttribute("addclosehook","urllib","urllib.response"),MovedAttribute("addinfo","urllib","urllib.response"),MovedAttribute("addinfourl","urllib","urllib.response"),]forattrin_urllib_response_moved_attributes:setattr(Module_six_moves_urllib_response,attr.name,attr)delattrModule_six_moves_urllib_response._moved_attributes=_urllib_response_moved_attributes_importer._add_module(Module_six_moves_urllib_response(__name__+".moves.urllib.response"),"moves.urllib_response","moves.urllib.response")classModule_six_moves_urllib_robotparser(_LazyModule):"""Lazy loading of moved objects in six.moves.urllib_robotparser"""_urllib_robotparser_moved_attributes=[MovedAttribute("RobotFileParser","robotparser","urllib.robotparser"),]forattrin_urllib_robotparser_moved_attributes:setattr(Module_six_moves_urllib_robotparser,attr.name,attr)delattrModule_six_moves_urllib_robotparser._moved_attributes=_urllib_robotparser_moved_attributes_importer._add_module(Module_six_moves_urllib_robotparser(__name__+".moves.urllib.robotparser"),"moves.urllib_robotparser","moves.urllib.robotparser")classModule_six_moves_urllib(types.ModuleType):"""Create a six.moves.urllib namespace that resembles the Python 3 namespace"""__path__=[]# mark as packageparse=_importer._get_module("moves.urllib_parse")error=_importer._get_module("moves.urllib_error")request=_importer._get_module("moves.urllib_request")response=_importer._get_module("moves.urllib_response")robotparser=_importer._get_module("moves.urllib_robotparser")def__dir__(self):return['parse','error','request','response','robotparser']_importer._add_module(Module_six_moves_urllib(__name__+".moves.urllib"),"moves.urllib")defadd_move(move):"""Add an item to six.moves."""setattr(_MovedItems,move.name,move)defremove_move(name):"""Remove item from six.moves."""try:delattr(_MovedItems,name)exceptAttributeError:try:delmoves.__dict__[name]exceptKeyError:raiseAttributeError("no such move, %r"%(name,))ifPY3:_meth_func="__func__"_meth_self="__self__"_func_closure="__closure__"_func_code="__code__"_func_defaults="__defaults__"_func_globals="__globals__"else:_meth_func="im_func"_meth_self="im_self"_func_closure="func_closure"_func_code="func_code"_func_defaults="func_defaults"_func_globals="func_globals"try:advance_iterator=nextexceptNameError:defadvance_iterator(it):returnit.next()next=advance_iteratortry:callable=callableexceptNameError:defcallable(obj):returnany("__call__"inklass.__dict__forklassintype(obj).__mro__)ifPY3:defget_unbound_function(unbound):returnunboundcreate_bound_method=types.MethodTypedefcreate_unbound_method(func,cls):returnfuncIterator=objectelse:defget_unbound_function(unbound):returnunbound.im_funcdefcreate_bound_method(func,obj):returntypes.MethodType(func,obj,obj.__class__)defcreate_unbound_method(func,cls):returntypes.MethodType(func,None,cls)classIterator(object):defnext(self):returntype(self).__next__(self)callable=callable_add_doc(get_unbound_function,"""Get the function out of a possibly unbound function""")get_method_function=operator.attrgetter(_meth_func)get_method_self=operator.attrgetter(_meth_self)get_function_closure=operator.attrgetter(_func_closure)get_function_code=operator.attrgetter(_func_code)get_function_defaults=operator.attrgetter(_func_defaults)get_function_globals=operator.attrgetter(_func_globals)ifPY3:defiterkeys(d,**kw):returniter(d.keys(**kw))defitervalues(d,**kw):returniter(d.values(**kw))defiteritems(d,**kw):returniter(d.items(**kw))defiterlists(d,**kw):returniter(d.lists(**kw))viewkeys=operator.methodcaller("keys")viewvalues=operator.methodcaller("values")viewitems=operator.methodcaller("items")else:defiterkeys(d,**kw):returnd.iterkeys(**kw)defitervalues(d,**kw):returnd.itervalues(**kw)defiteritems(d,**kw):returnd.iteritems(**kw)defiterlists(d,**kw):returnd.iterlists(**kw)viewkeys=operator.methodcaller("viewkeys")viewvalues=operator.methodcaller("viewvalues")viewitems=operator.methodcaller("viewitems")_add_doc(iterkeys,"Return an iterator over the keys of a dictionary.")_add_doc(itervalues,"Return an iterator over the values of a dictionary.")_add_doc(iteritems,"Return an iterator over the (key, value) pairs of a dictionary.")_add_doc(iterlists,"Return an iterator over the (key, [values]) pairs of a dictionary.")ifPY3:defb(s):returns.encode("latin-1")defu(s):returnsunichr=chrimportstructint2byte=struct.Struct(">B").packdelstructbyte2int=operator.itemgetter(0)indexbytes=operator.getitemiterbytes=iterimportioStringIO=io.StringIOBytesIO=io.BytesIO_assertCountEqual="assertCountEqual"ifsys.version_info[1]<=1:_assertRaisesRegex="assertRaisesRegexp"_assertRegex="assertRegexpMatches"else:_assertRaisesRegex="assertRaisesRegex"_assertRegex="assertRegex"else:defb(s):returns# Workaround for standalone backslashdefu(s):returnunicode(s.replace(r'\\',r'\\\\'),"unicode_escape")unichr=unichrint2byte=chrdefbyte2int(bs):returnord(bs[0])defindexbytes(buf,i):returnord(buf[i])iterbytes=functools.partial(itertools.imap,ord)importStringIOStringIO=BytesIO=StringIO.StringIO_assertCountEqual="assertItemsEqual"_assertRaisesRegex="assertRaisesRegexp"_assertRegex="assertRegexpMatches"_add_doc(b,"""Byte literal""")_add_doc(u,"""Text literal""")defassertCountEqual(self,*args,**kwargs):returngetattr(self,_assertCountEqual)(*args,**kwargs)defassertRaisesRegex(self,*args,**kwargs):returngetattr(self,_assertRaisesRegex)(*args,**kwargs)defassertRegex(self,*args,**kwargs):returngetattr(self,_assertRegex)(*args,**kwargs)ifPY3:exec_=getattr(moves.builtins,"exec")defreraise(tp,value,tb=None):try:ifvalueisNone:value=tp()ifvalue.__traceback__isnottb:raisevalue.with_traceback(tb)raisevaluefinally:value=Nonetb=Noneelse:defexec_(_code_,_globs_=None,_locs_=None):"""Execute code in a namespace."""if_globs_isNone:frame=sys._getframe(1)_globs_=frame.f_globalsif_locs_isNone:_locs_=frame.f_localsdelframeelif_locs_isNone:_locs_=_globs_exec("""exec _code_ in _globs_, _locs_""")exec_("""def reraise(tp, value, tb=None): try: raise tp, value, tb finally: tb = None""")ifsys.version_info[:2]==(3,2):exec_("""def raise_from(value, from_value): try: if from_value is None: raise value raise value from from_value finally: value = None""")elifsys.version_info[:2]>(3,2):exec_("""def raise_from(value, from_value): try: raise value from from_value finally: value = None""")else:defraise_from(value,from_value):raisevalueprint_=getattr(moves.builtins,"print",None)ifprint_isNone:defprint_(*args,**kwargs):"""The new-style print function for Python 2.4 and 2.5."""fp=kwargs.pop("file",sys.stdout)iffpisNone:returndefwrite(data):ifnotisinstance(data,basestring):data=str(data)# If the file has an encoding, encode unicode with it.if(isinstance(fp,file)andisinstance(data,unicode)andfp.encodingisnotNone):errors=getattr(fp,"errors",None)iferrorsisNone:errors="strict"data=data.encode(fp.encoding,errors)fp.write(data)want_unicode=Falsesep=kwargs.pop("sep",None)ifsepisnotNone:ifisinstance(sep,unicode):want_unicode=Trueelifnotisinstance(sep,str):raiseTypeError("sep must be None or a string")end=kwargs.pop("end",None)ifendisnotNone:ifisinstance(end,unicode):want_unicode=Trueelifnotisinstance(end,str):raiseTypeError("end must be None or a string")ifkwargs:raiseTypeError("invalid keyword arguments to print()")ifnotwant_unicode:forarginargs:ifisinstance(arg,unicode):want_unicode=Truebreakifwant_unicode:newline=unicode("\n")space=unicode(" ")else:newline="\n"space=" "ifsepisNone:sep=spaceifendisNone:end=newlinefori,arginenumerate(args):ifi:write(sep)write(arg)write(end)ifsys.version_info[:2]<(3,3):_print=print_defprint_(*args,**kwargs):fp=kwargs.get("file",sys.stdout)flush=kwargs.pop("flush",False)_print(*args,**kwargs)ifflushandfpisnotNone:fp.flush()_add_doc(reraise,"""Reraise an exception.""")ifsys.version_info[0:2]<(3,4):defwraps(wrapped,assigned=functools.WRAPPER_ASSIGNMENTS,updated=functools.WRAPPER_UPDATES):defwrapper(f):f=functools.wraps(wrapped,assigned,updated)(f)f.__wrapped__=wrappedreturnfreturnwrapperelse:wraps=functools.wraps
[docs]defwith_metaclass(meta,*bases):"""Create a base class with a metaclass."""# This requires a bit of explanation: the basic idea is to make a dummy# metaclass for one level of class instantiation that replaces itself with# the actual metaclass.classmetaclass(type):def__new__(cls,name,this_bases,d):returnmeta(name,bases,d)@classmethoddef__prepare__(cls,name,this_bases):returnmeta.__prepare__(name,bases)returntype.__new__(metaclass,'temporary_class',(),{})
defadd_metaclass(metaclass):"""Class decorator for creating a class with a metaclass."""defwrapper(cls):orig_vars=cls.__dict__.copy()slots=orig_vars.get('__slots__')ifslotsisnotNone:ifisinstance(slots,str):slots=[slots]forslots_varinslots:orig_vars.pop(slots_var)orig_vars.pop('__dict__',None)orig_vars.pop('__weakref__',None)ifhasattr(cls,'__qualname__'):orig_vars['__qualname__']=cls.__qualname__returnmetaclass(cls.__name__,cls.__bases__,orig_vars)returnwrapperdefensure_binary(s,encoding='utf-8',errors='strict'):"""Coerce **s** to six.binary_type. For Python 2: - `unicode` -> encoded to `str` - `str` -> `str` For Python 3: - `str` -> encoded to `bytes` - `bytes` -> `bytes` """ifisinstance(s,text_type):returns.encode(encoding,errors)elifisinstance(s,binary_type):returnselse:raiseTypeError("not expecting type '%s'"%type(s))defensure_str(s,encoding='utf-8',errors='strict'):"""Coerce *s* to `str`. For Python 2: - `unicode` -> encoded to `str` - `str` -> `str` For Python 3: - `str` -> `str` - `bytes` -> decoded to `str` """ifnotisinstance(s,(text_type,binary_type)):raiseTypeError("not expecting type '%s'"%type(s))ifPY2andisinstance(s,text_type):s=s.encode(encoding,errors)elifPY3andisinstance(s,binary_type):s=s.decode(encoding,errors)returnsdefensure_text(s,encoding='utf-8',errors='strict'):"""Coerce *s* to six.text_type. For Python 2: - `unicode` -> `unicode` - `str` -> `unicode` For Python 3: - `str` -> `str` - `bytes` -> decoded to `str` """ifisinstance(s,binary_type):returns.decode(encoding,errors)elifisinstance(s,text_type):returnselse:raiseTypeError("not expecting type '%s'"%type(s))defpython_2_unicode_compatible(klass):""" A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. """ifPY2:if'__str__'notinklass.__dict__:raiseValueError("@python_2_unicode_compatible cannot be applied ""to %s because it doesn't define __str__()."%klass.__name__)klass.__unicode__=klass.__str__klass.__str__=lambdaself:self.__unicode__().encode('utf-8')returnklass# Complete the moves implementation.# This code is at the end of this module to speed up module loading.# Turn this module into a package.__path__=[]# required for PEP 302 and PEP 451__package__=__name__# see PEP 366 @ReservedAssignmentifglobals().get("__spec__")isnotNone:__spec__.submodule_search_locations=[]# PEP 451 @UndefinedVariable# Remove other six meta path importers, since they cause problems. This can# happen if six is removed from sys.modules and then reloaded. (Setuptools does# this for some reason.)ifsys.meta_path:fori,importerinenumerate(sys.meta_path):# Here's some real nastiness: Another "instance" of the six module might# be floating around. Therefore, we can't use isinstance() to check for# the six meta path importer, since the other six instance will have# inserted an importer with different class.if(type(importer).__name__=="_SixMetaPathImporter"andimporter.name==__name__):delsys.meta_path[i]breakdeli,importer# Finally, add the importer to the meta path import hook.sys.meta_path.append(_importer)