OLD | NEW |
---|---|
(Empty) | |
1 """Utilities for writing code that runs on Python 2 and 3""" | |
agable
2015/08/10 22:23:58
Similarly here: the symlink above is to appengine/
jshu
2015/08/11 21:57:18
same as other place, appengine/third_party symlink
| |
2 | |
3 # Copyright (c) 2010-2015 Benjamin Peterson | |
4 # | |
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: | |
11 # | |
12 # The above copyright notice and this permission notice shall be included in all | |
13 # copies or substantial portions of the Software. | |
14 # | |
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 | |
21 # SOFTWARE. | |
22 | |
23 from __future__ import absolute_import | |
24 | |
25 import functools | |
26 import itertools | |
27 import operator | |
28 import sys | |
29 import types | |
30 | |
31 __author__ = "Benjamin Peterson <benjamin@python.org>" | |
32 __version__ = "1.9.0" | |
33 | |
34 | |
35 # Useful for very coarse version differentiation. | |
36 PY2 = sys.version_info[0] == 2 | |
37 PY3 = sys.version_info[0] == 3 | |
38 | |
39 if PY3: | |
40 string_types = str, | |
41 integer_types = int, | |
42 class_types = type, | |
43 text_type = str | |
44 binary_type = bytes | |
45 | |
46 MAXSIZE = sys.maxsize | |
47 else: | |
48 string_types = basestring, | |
49 integer_types = (int, long) | |
50 class_types = (type, types.ClassType) | |
51 text_type = unicode | |
52 binary_type = str | |
53 | |
54 if sys.platform.startswith("java"): | |
55 # Jython always uses 32 bits. | |
56 MAXSIZE = int((1 << 31) - 1) | |
57 else: | |
58 # It's possible to have sizeof(long) != sizeof(Py_ssize_t). | |
59 class X(object): | |
60 def __len__(self): | |
61 return 1 << 31 | |
62 try: | |
63 len(X()) | |
64 except OverflowError: | |
65 # 32-bit | |
66 MAXSIZE = int((1 << 31) - 1) | |
67 else: | |
68 # 64-bit | |
69 MAXSIZE = int((1 << 63) - 1) | |
70 del X | |
71 | |
72 | |
73 def _add_doc(func, doc): | |
74 """Add documentation to a function.""" | |
75 func.__doc__ = doc | |
76 | |
77 | |
78 def _import_module(name): | |
79 """Import module, returning the module after the last dot.""" | |
80 __import__(name) | |
81 return sys.modules[name] | |
82 | |
83 | |
84 class _LazyDescr(object): | |
85 | |
86 def __init__(self, name): | |
87 self.name = name | |
88 | |
89 def __get__(self, obj, tp): | |
90 result = self._resolve() | |
91 setattr(obj, self.name, result) # Invokes __set__. | |
92 try: | |
93 # This is a bit ugly, but it avoids running this again by | |
94 # removing this descriptor. | |
95 delattr(obj.__class__, self.name) | |
96 except AttributeError: | |
97 pass | |
98 return result | |
99 | |
100 | |
101 class MovedModule(_LazyDescr): | |
102 | |
103 def __init__(self, name, old, new=None): | |
104 super(MovedModule, self).__init__(name) | |
105 if PY3: | |
106 if new is None: | |
107 new = name | |
108 self.mod = new | |
109 else: | |
110 self.mod = old | |
111 | |
112 def _resolve(self): | |
113 return _import_module(self.mod) | |
114 | |
115 def __getattr__(self, attr): | |
116 _module = self._resolve() | |
117 value = getattr(_module, attr) | |
118 setattr(self, attr, value) | |
119 return value | |
120 | |
121 | |
122 class _LazyModule(types.ModuleType): | |
123 | |
124 def __init__(self, name): | |
125 super(_LazyModule, self).__init__(name) | |
126 self.__doc__ = self.__class__.__doc__ | |
127 | |
128 def __dir__(self): | |
129 attrs = ["__doc__", "__name__"] | |
130 attrs += [attr.name for attr in self._moved_attributes] | |
131 return attrs | |
132 | |
133 # Subclasses should override this | |
134 _moved_attributes = [] | |
135 | |
136 | |
137 class MovedAttribute(_LazyDescr): | |
138 | |
139 def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): | |
140 super(MovedAttribute, self).__init__(name) | |
141 if PY3: | |
142 if new_mod is None: | |
143 new_mod = name | |
144 self.mod = new_mod | |
145 if new_attr is None: | |
146 if old_attr is None: | |
147 new_attr = name | |
148 else: | |
149 new_attr = old_attr | |
150 self.attr = new_attr | |
151 else: | |
152 self.mod = old_mod | |
153 if old_attr is None: | |
154 old_attr = name | |
155 self.attr = old_attr | |
156 | |
157 def _resolve(self): | |
158 module = _import_module(self.mod) | |
159 return getattr(module, self.attr) | |
160 | |
161 | |
162 class _SixMetaPathImporter(object): | |
163 """ | |
164 A meta path importer to import six.moves and its submodules. | |
165 | |
166 This class implements a PEP302 finder and loader. It should be compatible | |
167 with Python 2.5 and all existing versions of Python3 | |
168 """ | |
169 def __init__(self, six_module_name): | |
170 self.name = six_module_name | |
171 self.known_modules = {} | |
172 | |
173 def _add_module(self, mod, *fullnames): | |
174 for fullname in fullnames: | |
175 self.known_modules[self.name + "." + fullname] = mod | |
176 | |
177 def _get_module(self, fullname): | |
178 return self.known_modules[self.name + "." + fullname] | |
179 | |
180 def find_module(self, fullname, path=None): | |
181 if fullname in self.known_modules: | |
182 return self | |
183 return None | |
184 | |
185 def __get_module(self, fullname): | |
186 try: | |
187 return self.known_modules[fullname] | |
188 except KeyError: | |
189 raise ImportError("This loader does not know module " + fullname) | |
190 | |
191 def load_module(self, fullname): | |
192 try: | |
193 # in case of a reload | |
194 return sys.modules[fullname] | |
195 except KeyError: | |
196 pass | |
197 mod = self.__get_module(fullname) | |
198 if isinstance(mod, MovedModule): | |
199 mod = mod._resolve() | |
200 else: | |
201 mod.__loader__ = self | |
202 sys.modules[fullname] = mod | |
203 return mod | |
204 | |
205 def is_package(self, fullname): | |
206 """ | |
207 Return true, if the named module is a package. | |
208 | |
209 We need this method to get correct spec objects with | |
210 Python 3.4 (see PEP451) | |
211 """ | |
212 return hasattr(self.__get_module(fullname), "__path__") | |
213 | |
214 def get_code(self, fullname): | |
215 """Return None | |
216 | |
217 Required, if is_package is implemented""" | |
218 self.__get_module(fullname) # eventually raises ImportError | |
219 return None | |
220 get_source = get_code # same as get_code | |
221 | |
222 _importer = _SixMetaPathImporter(__name__) | |
223 | |
224 | |
225 class _MovedItems(_LazyModule): | |
226 """Lazy loading of moved objects""" | |
227 __path__ = [] # mark as package | |
228 | |
229 | |
230 _moved_attributes = [ | |
231 MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), | |
232 MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), | |
233 MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "fil terfalse"), | |
234 MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), | |
235 MovedAttribute("intern", "__builtin__", "sys"), | |
236 MovedAttribute("map", "itertools", "builtins", "imap", "map"), | |
237 MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), | |
238 MovedAttribute("reload_module", "__builtin__", "imp", "reload"), | |
239 MovedAttribute("reduce", "__builtin__", "functools"), | |
240 MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), | |
241 MovedAttribute("StringIO", "StringIO", "io"), | |
242 MovedAttribute("UserDict", "UserDict", "collections"), | |
243 MovedAttribute("UserList", "UserList", "collections"), | |
244 MovedAttribute("UserString", "UserString", "collections"), | |
245 MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), | |
246 MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), | |
247 MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip _longest"), | |
248 | |
249 MovedModule("builtins", "__builtin__"), | |
250 MovedModule("configparser", "ConfigParser"), | |
251 MovedModule("copyreg", "copy_reg"), | |
252 MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), | |
253 MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), | |
254 MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), | |
255 MovedModule("http_cookies", "Cookie", "http.cookies"), | |
256 MovedModule("html_entities", "htmlentitydefs", "html.entities"), | |
257 MovedModule("html_parser", "HTMLParser", "html.parser"), | |
258 MovedModule("http_client", "httplib", "http.client"), | |
259 MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multi part"), | |
260 MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime .nonmultipart"), | |
261 MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), | |
262 MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), | |
263 MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), | |
264 MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), | |
265 MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), | |
266 MovedModule("cPickle", "cPickle", "pickle"), | |
267 MovedModule("queue", "Queue"), | |
268 MovedModule("reprlib", "repr"), | |
269 MovedModule("socketserver", "SocketServer"), | |
270 MovedModule("_thread", "thread", "_thread"), | |
271 MovedModule("tkinter", "Tkinter"), | |
272 MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), | |
273 MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), | |
274 MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), | |
275 MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), | |
276 MovedModule("tkinter_tix", "Tix", "tkinter.tix"), | |
277 MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), | |
278 MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), | |
279 MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), | |
280 MovedModule("tkinter_colorchooser", "tkColorChooser", | |
281 "tkinter.colorchooser"), | |
282 MovedModule("tkinter_commondialog", "tkCommonDialog", | |
283 "tkinter.commondialog"), | |
284 MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), | |
285 MovedModule("tkinter_font", "tkFont", "tkinter.font"), | |
286 MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), | |
287 MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", | |
288 "tkinter.simpledialog"), | |
289 MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse" ), | |
290 MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error" ), | |
291 MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib" ), | |
292 MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), | |
293 MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), | |
294 MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), | |
295 MovedModule("winreg", "_winreg"), | |
296 ] | |
297 for attr in _moved_attributes: | |
298 setattr(_MovedItems, attr.name, attr) | |
299 if isinstance(attr, MovedModule): | |
300 _importer._add_module(attr, "moves." + attr.name) | |
301 del attr | |
302 | |
303 _MovedItems._moved_attributes = _moved_attributes | |
304 | |
305 moves = _MovedItems(__name__ + ".moves") | |
306 _importer._add_module(moves, "moves") | |
307 | |
308 | |
309 class Module_six_moves_urllib_parse(_LazyModule): | |
310 """Lazy loading of moved objects in six.moves.urllib_parse""" | |
311 | |
312 | |
313 _urllib_parse_moved_attributes = [ | |
314 MovedAttribute("ParseResult", "urlparse", "urllib.parse"), | |
315 MovedAttribute("SplitResult", "urlparse", "urllib.parse"), | |
316 MovedAttribute("parse_qs", "urlparse", "urllib.parse"), | |
317 MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), | |
318 MovedAttribute("urldefrag", "urlparse", "urllib.parse"), | |
319 MovedAttribute("urljoin", "urlparse", "urllib.parse"), | |
320 MovedAttribute("urlparse", "urlparse", "urllib.parse"), | |
321 MovedAttribute("urlsplit", "urlparse", "urllib.parse"), | |
322 MovedAttribute("urlunparse", "urlparse", "urllib.parse"), | |
323 MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), | |
324 MovedAttribute("quote", "urllib", "urllib.parse"), | |
325 MovedAttribute("quote_plus", "urllib", "urllib.parse"), | |
326 MovedAttribute("unquote", "urllib", "urllib.parse"), | |
327 MovedAttribute("unquote_plus", "urllib", "urllib.parse"), | |
328 MovedAttribute("urlencode", "urllib", "urllib.parse"), | |
329 MovedAttribute("splitquery", "urllib", "urllib.parse"), | |
330 MovedAttribute("splittag", "urllib", "urllib.parse"), | |
331 MovedAttribute("splituser", "urllib", "urllib.parse"), | |
332 MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), | |
333 MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), | |
334 MovedAttribute("uses_params", "urlparse", "urllib.parse"), | |
335 MovedAttribute("uses_query", "urlparse", "urllib.parse"), | |
336 MovedAttribute("uses_relative", "urlparse", "urllib.parse"), | |
337 ] | |
338 for attr in _urllib_parse_moved_attributes: | |
339 setattr(Module_six_moves_urllib_parse, attr.name, attr) | |
340 del attr | |
341 | |
342 Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes | |
343 | |
344 _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_pa rse"), | |
345 "moves.urllib_parse", "moves.urllib.parse") | |
346 | |
347 | |
348 class Module_six_moves_urllib_error(_LazyModule): | |
349 """Lazy loading of moved objects in six.moves.urllib_error""" | |
350 | |
351 | |
352 _urllib_error_moved_attributes = [ | |
353 MovedAttribute("URLError", "urllib2", "urllib.error"), | |
354 MovedAttribute("HTTPError", "urllib2", "urllib.error"), | |
355 MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), | |
356 ] | |
357 for attr in _urllib_error_moved_attributes: | |
358 setattr(Module_six_moves_urllib_error, attr.name, attr) | |
359 del attr | |
360 | |
361 Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes | |
362 | |
363 _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.er ror"), | |
364 "moves.urllib_error", "moves.urllib.error") | |
365 | |
366 | |
367 class Module_six_moves_urllib_request(_LazyModule): | |
368 """Lazy loading of moved objects in six.moves.urllib_request""" | |
369 | |
370 | |
371 _urllib_request_moved_attributes = [ | |
372 MovedAttribute("urlopen", "urllib2", "urllib.request"), | |
373 MovedAttribute("install_opener", "urllib2", "urllib.request"), | |
374 MovedAttribute("build_opener", "urllib2", "urllib.request"), | |
375 MovedAttribute("pathname2url", "urllib", "urllib.request"), | |
376 MovedAttribute("url2pathname", "urllib", "urllib.request"), | |
377 MovedAttribute("getproxies", "urllib", "urllib.request"), | |
378 MovedAttribute("Request", "urllib2", "urllib.request"), | |
379 MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), | |
380 MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), | |
381 MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), | |
382 MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), | |
383 MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), | |
384 MovedAttribute("BaseHandler", "urllib2", "urllib.request"), | |
385 MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), | |
386 MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request "), | |
387 MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), | |
388 MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), | |
389 MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), | |
390 MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), | |
391 MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), | |
392 MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), | |
393 MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), | |
394 MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), | |
395 MovedAttribute("FileHandler", "urllib2", "urllib.request"), | |
396 MovedAttribute("FTPHandler", "urllib2", "urllib.request"), | |
397 MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), | |
398 MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), | |
399 MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), | |
400 MovedAttribute("urlretrieve", "urllib", "urllib.request"), | |
401 MovedAttribute("urlcleanup", "urllib", "urllib.request"), | |
402 MovedAttribute("URLopener", "urllib", "urllib.request"), | |
403 MovedAttribute("FancyURLopener", "urllib", "urllib.request"), | |
404 MovedAttribute("proxy_bypass", "urllib", "urllib.request"), | |
405 ] | |
406 for attr in _urllib_request_moved_attributes: | |
407 setattr(Module_six_moves_urllib_request, attr.name, attr) | |
408 del attr | |
409 | |
410 Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attrib utes | |
411 | |
412 _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib. request"), | |
413 "moves.urllib_request", "moves.urllib.request") | |
414 | |
415 | |
416 class Module_six_moves_urllib_response(_LazyModule): | |
417 """Lazy loading of moved objects in six.moves.urllib_response""" | |
418 | |
419 | |
420 _urllib_response_moved_attributes = [ | |
421 MovedAttribute("addbase", "urllib", "urllib.response"), | |
422 MovedAttribute("addclosehook", "urllib", "urllib.response"), | |
423 MovedAttribute("addinfo", "urllib", "urllib.response"), | |
424 MovedAttribute("addinfourl", "urllib", "urllib.response"), | |
425 ] | |
426 for attr in _urllib_response_moved_attributes: | |
427 setattr(Module_six_moves_urllib_response, attr.name, attr) | |
428 del attr | |
429 | |
430 Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attr ibutes | |
431 | |
432 _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib .response"), | |
433 "moves.urllib_response", "moves.urllib.response") | |
434 | |
435 | |
436 class Module_six_moves_urllib_robotparser(_LazyModule): | |
437 """Lazy loading of moved objects in six.moves.urllib_robotparser""" | |
438 | |
439 | |
440 _urllib_robotparser_moved_attributes = [ | |
441 MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), | |
442 ] | |
443 for attr in _urllib_robotparser_moved_attributes: | |
444 setattr(Module_six_moves_urllib_robotparser, attr.name, attr) | |
445 del attr | |
446 | |
447 Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_move d_attributes | |
448 | |
449 _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.url lib.robotparser"), | |
450 "moves.urllib_robotparser", "moves.urllib.robotparser") | |
451 | |
452 | |
453 class Module_six_moves_urllib(types.ModuleType): | |
454 """Create a six.moves.urllib namespace that resembles the Python 3 namespace """ | |
455 __path__ = [] # mark as package | |
456 parse = _importer._get_module("moves.urllib_parse") | |
457 error = _importer._get_module("moves.urllib_error") | |
458 request = _importer._get_module("moves.urllib_request") | |
459 response = _importer._get_module("moves.urllib_response") | |
460 robotparser = _importer._get_module("moves.urllib_robotparser") | |
461 | |
462 def __dir__(self): | |
463 return ['parse', 'error', 'request', 'response', 'robotparser'] | |
464 | |
465 _importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), | |
466 "moves.urllib") | |
467 | |
468 | |
469 def add_move(move): | |
470 """Add an item to six.moves.""" | |
471 setattr(_MovedItems, move.name, move) | |
472 | |
473 | |
474 def remove_move(name): | |
475 """Remove item from six.moves.""" | |
476 try: | |
477 delattr(_MovedItems, name) | |
478 except AttributeError: | |
479 try: | |
480 del moves.__dict__[name] | |
481 except KeyError: | |
482 raise AttributeError("no such move, %r" % (name,)) | |
483 | |
484 | |
485 if PY3: | |
486 _meth_func = "__func__" | |
487 _meth_self = "__self__" | |
488 | |
489 _func_closure = "__closure__" | |
490 _func_code = "__code__" | |
491 _func_defaults = "__defaults__" | |
492 _func_globals = "__globals__" | |
493 else: | |
494 _meth_func = "im_func" | |
495 _meth_self = "im_self" | |
496 | |
497 _func_closure = "func_closure" | |
498 _func_code = "func_code" | |
499 _func_defaults = "func_defaults" | |
500 _func_globals = "func_globals" | |
501 | |
502 | |
503 try: | |
504 advance_iterator = next | |
505 except NameError: | |
506 def advance_iterator(it): | |
507 return it.next() | |
508 next = advance_iterator | |
509 | |
510 | |
511 try: | |
512 callable = callable | |
513 except NameError: | |
514 def callable(obj): | |
515 return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) | |
516 | |
517 | |
518 if PY3: | |
519 def get_unbound_function(unbound): | |
520 return unbound | |
521 | |
522 create_bound_method = types.MethodType | |
523 | |
524 Iterator = object | |
525 else: | |
526 def get_unbound_function(unbound): | |
527 return unbound.im_func | |
528 | |
529 def create_bound_method(func, obj): | |
530 return types.MethodType(func, obj, obj.__class__) | |
531 | |
532 class Iterator(object): | |
533 | |
534 def next(self): | |
535 return type(self).__next__(self) | |
536 | |
537 callable = callable | |
538 _add_doc(get_unbound_function, | |
539 """Get the function out of a possibly unbound function""") | |
540 | |
541 | |
542 get_method_function = operator.attrgetter(_meth_func) | |
543 get_method_self = operator.attrgetter(_meth_self) | |
544 get_function_closure = operator.attrgetter(_func_closure) | |
545 get_function_code = operator.attrgetter(_func_code) | |
546 get_function_defaults = operator.attrgetter(_func_defaults) | |
547 get_function_globals = operator.attrgetter(_func_globals) | |
548 | |
549 | |
550 if PY3: | |
551 def iterkeys(d, **kw): | |
552 return iter(d.keys(**kw)) | |
553 | |
554 def itervalues(d, **kw): | |
555 return iter(d.values(**kw)) | |
556 | |
557 def iteritems(d, **kw): | |
558 return iter(d.items(**kw)) | |
559 | |
560 def iterlists(d, **kw): | |
561 return iter(d.lists(**kw)) | |
562 | |
563 viewkeys = operator.methodcaller("keys") | |
564 | |
565 viewvalues = operator.methodcaller("values") | |
566 | |
567 viewitems = operator.methodcaller("items") | |
568 else: | |
569 def iterkeys(d, **kw): | |
570 return iter(d.iterkeys(**kw)) | |
571 | |
572 def itervalues(d, **kw): | |
573 return iter(d.itervalues(**kw)) | |
574 | |
575 def iteritems(d, **kw): | |
576 return iter(d.iteritems(**kw)) | |
577 | |
578 def iterlists(d, **kw): | |
579 return iter(d.iterlists(**kw)) | |
580 | |
581 viewkeys = operator.methodcaller("viewkeys") | |
582 | |
583 viewvalues = operator.methodcaller("viewvalues") | |
584 | |
585 viewitems = operator.methodcaller("viewitems") | |
586 | |
587 _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") | |
588 _add_doc(itervalues, "Return an iterator over the values of a dictionary.") | |
589 _add_doc(iteritems, | |
590 "Return an iterator over the (key, value) pairs of a dictionary.") | |
591 _add_doc(iterlists, | |
592 "Return an iterator over the (key, [values]) pairs of a dictionary.") | |
593 | |
594 | |
595 if PY3: | |
596 def b(s): | |
597 return s.encode("latin-1") | |
598 def u(s): | |
599 return s | |
600 unichr = chr | |
601 if sys.version_info[1] <= 1: | |
602 def int2byte(i): | |
603 return bytes((i,)) | |
604 else: | |
605 # This is about 2x faster than the implementation above on 3.2+ | |
606 int2byte = operator.methodcaller("to_bytes", 1, "big") | |
607 byte2int = operator.itemgetter(0) | |
608 indexbytes = operator.getitem | |
609 iterbytes = iter | |
610 import io | |
611 StringIO = io.StringIO | |
612 BytesIO = io.BytesIO | |
613 _assertCountEqual = "assertCountEqual" | |
614 _assertRaisesRegex = "assertRaisesRegex" | |
615 _assertRegex = "assertRegex" | |
616 else: | |
617 def b(s): | |
618 return s | |
619 # Workaround for standalone backslash | |
620 def u(s): | |
621 return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") | |
622 unichr = unichr | |
623 int2byte = chr | |
624 def byte2int(bs): | |
625 return ord(bs[0]) | |
626 def indexbytes(buf, i): | |
627 return ord(buf[i]) | |
628 iterbytes = functools.partial(itertools.imap, ord) | |
629 import StringIO | |
630 StringIO = BytesIO = StringIO.StringIO | |
631 _assertCountEqual = "assertItemsEqual" | |
632 _assertRaisesRegex = "assertRaisesRegexp" | |
633 _assertRegex = "assertRegexpMatches" | |
634 _add_doc(b, """Byte literal""") | |
635 _add_doc(u, """Text literal""") | |
636 | |
637 | |
638 def assertCountEqual(self, *args, **kwargs): | |
639 return getattr(self, _assertCountEqual)(*args, **kwargs) | |
640 | |
641 | |
642 def assertRaisesRegex(self, *args, **kwargs): | |
643 return getattr(self, _assertRaisesRegex)(*args, **kwargs) | |
644 | |
645 | |
646 def assertRegex(self, *args, **kwargs): | |
647 return getattr(self, _assertRegex)(*args, **kwargs) | |
648 | |
649 | |
650 if PY3: | |
651 exec_ = getattr(moves.builtins, "exec") | |
652 | |
653 | |
654 def reraise(tp, value, tb=None): | |
655 if value is None: | |
656 value = tp() | |
657 if value.__traceback__ is not tb: | |
658 raise value.with_traceback(tb) | |
659 raise value | |
660 | |
661 else: | |
662 def exec_(_code_, _globs_=None, _locs_=None): | |
663 """Execute code in a namespace.""" | |
664 if _globs_ is None: | |
665 frame = sys._getframe(1) | |
666 _globs_ = frame.f_globals | |
667 if _locs_ is None: | |
668 _locs_ = frame.f_locals | |
669 del frame | |
670 elif _locs_ is None: | |
671 _locs_ = _globs_ | |
672 exec("""exec _code_ in _globs_, _locs_""") | |
673 | |
674 | |
675 exec_("""def reraise(tp, value, tb=None): | |
676 raise tp, value, tb | |
677 """) | |
678 | |
679 | |
680 if sys.version_info[:2] == (3, 2): | |
681 exec_("""def raise_from(value, from_value): | |
682 if from_value is None: | |
683 raise value | |
684 raise value from from_value | |
685 """) | |
686 elif sys.version_info[:2] > (3, 2): | |
687 exec_("""def raise_from(value, from_value): | |
688 raise value from from_value | |
689 """) | |
690 else: | |
691 def raise_from(value, from_value): | |
692 raise value | |
693 | |
694 | |
695 print_ = getattr(moves.builtins, "print", None) | |
696 if print_ is None: | |
697 def print_(*args, **kwargs): | |
698 """The new-style print function for Python 2.4 and 2.5.""" | |
699 fp = kwargs.pop("file", sys.stdout) | |
700 if fp is None: | |
701 return | |
702 def write(data): | |
703 if not isinstance(data, basestring): | |
704 data = str(data) | |
705 # If the file has an encoding, encode unicode with it. | |
706 if (isinstance(fp, file) and | |
707 isinstance(data, unicode) and | |
708 fp.encoding is not None): | |
709 errors = getattr(fp, "errors", None) | |
710 if errors is None: | |
711 errors = "strict" | |
712 data = data.encode(fp.encoding, errors) | |
713 fp.write(data) | |
714 want_unicode = False | |
715 sep = kwargs.pop("sep", None) | |
716 if sep is not None: | |
717 if isinstance(sep, unicode): | |
718 want_unicode = True | |
719 elif not isinstance(sep, str): | |
720 raise TypeError("sep must be None or a string") | |
721 end = kwargs.pop("end", None) | |
722 if end is not None: | |
723 if isinstance(end, unicode): | |
724 want_unicode = True | |
725 elif not isinstance(end, str): | |
726 raise TypeError("end must be None or a string") | |
727 if kwargs: | |
728 raise TypeError("invalid keyword arguments to print()") | |
729 if not want_unicode: | |
730 for arg in args: | |
731 if isinstance(arg, unicode): | |
732 want_unicode = True | |
733 break | |
734 if want_unicode: | |
735 newline = unicode("\n") | |
736 space = unicode(" ") | |
737 else: | |
738 newline = "\n" | |
739 space = " " | |
740 if sep is None: | |
741 sep = space | |
742 if end is None: | |
743 end = newline | |
744 for i, arg in enumerate(args): | |
745 if i: | |
746 write(sep) | |
747 write(arg) | |
748 write(end) | |
749 if sys.version_info[:2] < (3, 3): | |
750 _print = print_ | |
751 def print_(*args, **kwargs): | |
752 fp = kwargs.get("file", sys.stdout) | |
753 flush = kwargs.pop("flush", False) | |
754 _print(*args, **kwargs) | |
755 if flush and fp is not None: | |
756 fp.flush() | |
757 | |
758 _add_doc(reraise, """Reraise an exception.""") | |
759 | |
760 if sys.version_info[0:2] < (3, 4): | |
761 def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, | |
762 updated=functools.WRAPPER_UPDATES): | |
763 def wrapper(f): | |
764 f = functools.wraps(wrapped, assigned, updated)(f) | |
765 f.__wrapped__ = wrapped | |
766 return f | |
767 return wrapper | |
768 else: | |
769 wraps = functools.wraps | |
770 | |
771 def with_metaclass(meta, *bases): | |
772 """Create a base class with a metaclass.""" | |
773 # This requires a bit of explanation: the basic idea is to make a dummy | |
774 # metaclass for one level of class instantiation that replaces itself with | |
775 # the actual metaclass. | |
776 class metaclass(meta): | |
777 def __new__(cls, name, this_bases, d): | |
778 return meta(name, bases, d) | |
779 return type.__new__(metaclass, 'temporary_class', (), {}) | |
780 | |
781 | |
782 def add_metaclass(metaclass): | |
783 """Class decorator for creating a class with a metaclass.""" | |
784 def wrapper(cls): | |
785 orig_vars = cls.__dict__.copy() | |
786 slots = orig_vars.get('__slots__') | |
787 if slots is not None: | |
788 if isinstance(slots, str): | |
789 slots = [slots] | |
790 for slots_var in slots: | |
791 orig_vars.pop(slots_var) | |
792 orig_vars.pop('__dict__', None) | |
793 orig_vars.pop('__weakref__', None) | |
794 return metaclass(cls.__name__, cls.__bases__, orig_vars) | |
795 return wrapper | |
796 | |
797 | |
798 def python_2_unicode_compatible(klass): | |
799 """ | |
800 A decorator that defines __unicode__ and __str__ methods under Python 2. | |
801 Under Python 3 it does nothing. | |
802 | |
803 To support Python 2 and 3 with a single code base, define a __str__ method | |
804 returning text and apply this decorator to the class. | |
805 """ | |
806 if PY2: | |
807 if '__str__' not in klass.__dict__: | |
808 raise ValueError("@python_2_unicode_compatible cannot be applied " | |
809 "to %s because it doesn't define __str__()." % | |
810 klass.__name__) | |
811 klass.__unicode__ = klass.__str__ | |
812 klass.__str__ = lambda self: self.__unicode__().encode('utf-8') | |
813 return klass | |
814 | |
815 | |
816 # Complete the moves implementation. | |
817 # This code is at the end of this module to speed up module loading. | |
818 # Turn this module into a package. | |
819 __path__ = [] # required for PEP 302 and PEP 451 | |
820 __package__ = __name__ # see PEP 366 @ReservedAssignment | |
821 if globals().get("__spec__") is not None: | |
822 __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable | |
823 # Remove other six meta path importers, since they cause problems. This can | |
824 # happen if six is removed from sys.modules and then reloaded. (Setuptools does | |
825 # this for some reason.) | |
826 if sys.meta_path: | |
827 for i, importer in enumerate(sys.meta_path): | |
828 # Here's some real nastiness: Another "instance" of the six module might | |
829 # be floating around. Therefore, we can't use isinstance() to check for | |
830 # the six meta path importer, since the other six instance will have | |
831 # inserted an importer with different class. | |
832 if (type(importer).__name__ == "_SixMetaPathImporter" and | |
833 importer.name == __name__): | |
834 del sys.meta_path[i] | |
835 break | |
836 del i, importer | |
837 # Finally, add the importer to the meta path import hook. | |
838 sys.meta_path.append(_importer) | |
OLD | NEW |