1 """Utilities for writing code that runs on Python 2 and 3"""
2
3 import operator
4 import sys
5 import types
6
7 __author__ = "Benjamin Peterson <benjamin@python.org>"
8 __version__ = "1.2.0"
9
10
11
12 PY3 = sys.version_info[0] == 3
13
14 if PY3:
15 string_types = str,
16 integer_types = int,
17 class_types = type,
18 text_type = str
19 binary_type = bytes
20
21 MAXSIZE = sys.maxsize
22 else:
23 string_types = basestring,
24 integer_types = (int, long)
25 class_types = (type, types.ClassType)
26 text_type = unicode
27 binary_type = str
28
29 if sys.platform == "java":
30
31 MAXSIZE = int((1 << 31) - 1)
32 else:
33
37 try:
38 len(X())
39 except OverflowError:
40
41 MAXSIZE = int((1 << 31) - 1)
42 else:
43
44 MAXSIZE = int((1 << 63) - 1)
45 del X
46
47
49 """Add documentation to a function."""
50 func.__doc__ = doc
51
52
54 """Import module, returning the module after the last dot."""
55 __import__(name)
56 return sys.modules[name]
57
58
60
63
65 result = self._resolve()
66 setattr(obj, self.name, result)
67
68 delattr(tp, self.name)
69 return result
70
71
73
74 - def __init__(self, name, old, new=None):
82
85
86
88
89 - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
90 super(MovedAttribute, self).__init__(name)
91 if PY3:
92 if new_mod is None:
93 new_mod = name
94 self.mod = new_mod
95 if new_attr is None:
96 if old_attr is None:
97 new_attr = name
98 else:
99 new_attr = old_attr
100 self.attr = new_attr
101 else:
102 self.mod = old_mod
103 if old_attr is None:
104 old_attr = name
105 self.attr = old_attr
106
110
111
112
114 """Lazy loading of moved objects"""
115
116
117 _moved_attributes = [
118 MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
119 MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
120 MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
121 MovedAttribute("map", "itertools", "builtins", "imap", "map"),
122 MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
123 MovedAttribute("reduce", "__builtin__", "functools"),
124 MovedAttribute("StringIO", "StringIO", "io"),
125 MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
126 MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
127
128 MovedModule("builtins", "__builtin__"),
129 MovedModule("configparser", "ConfigParser"),
130 MovedModule("copyreg", "copy_reg"),
131 MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
132 MovedModule("http_cookies", "Cookie", "http.cookies"),
133 MovedModule("html_entities", "htmlentitydefs", "html.entities"),
134 MovedModule("html_parser", "HTMLParser", "html.parser"),
135 MovedModule("http_client", "httplib", "http.client"),
136 MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
137 MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
138 MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
139 MovedModule("cPickle", "cPickle", "pickle"),
140 MovedModule("queue", "Queue"),
141 MovedModule("reprlib", "repr"),
142 MovedModule("socketserver", "SocketServer"),
143 MovedModule("tkinter", "Tkinter"),
144 MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
145 MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
146 MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
147 MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
148 MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
149 MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
150 MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
151 MovedModule("tkinter_colorchooser", "tkColorChooser",
152 "tkinter.colorchooser"),
153 MovedModule("tkinter_commondialog", "tkCommonDialog",
154 "tkinter.commondialog"),
155 MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
156 MovedModule("tkinter_font", "tkFont", "tkinter.font"),
157 MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
158 MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
159 "tkinter.simpledialog"),
160 MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
161 MovedModule("winreg", "_winreg"),
162 ]
163 for attr in _moved_attributes:
164 setattr(_MovedItems, attr.name, attr)
165 del attr
166
167 moves = sys.modules["PyFoam.ThirdParty.six.moves"] = _MovedItems("moves")
168
169
170
172 """Add an item to six.moves."""
173 setattr(_MovedItems, move.name, move)
174
175
177 """Remove item from six.moves."""
178 try:
179 delattr(_MovedItems, name)
180 except AttributeError:
181 try:
182 del moves.__dict__[name]
183 except KeyError:
184 raise AttributeError("no such move, %r" % (name,))
185
186
187 if PY3:
188 _meth_func = "__func__"
189 _meth_self = "__self__"
190
191 _func_code = "__code__"
192 _func_defaults = "__defaults__"
193
194 _iterkeys = "keys"
195 _itervalues = "values"
196 _iteritems = "items"
197 else:
198 _meth_func = "im_func"
199 _meth_self = "im_self"
200
201 _func_code = "func_code"
202 _func_defaults = "func_defaults"
203
204 _iterkeys = "iterkeys"
205 _itervalues = "itervalues"
206 _iteritems = "iteritems"
207
208
209 try:
210 advance_iterator = next
211 except NameError:
214 next = advance_iterator
215
216
217 if PY3:
220
221 Iterator = object
222
224 return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
225 else:
227 return unbound.im_func
228
233
234 callable = callable
235 _add_doc(get_unbound_function,
236 """Get the function out of a possibly unbound function""")
237
238
239 get_method_function = operator.attrgetter(_meth_func)
240 get_method_self = operator.attrgetter(_meth_self)
241 get_function_code = operator.attrgetter(_func_code)
242 get_function_defaults = operator.attrgetter(_func_defaults)
243
244
246 """Return an iterator over the keys of a dictionary."""
247 return iter(getattr(d, _iterkeys)())
248
250 """Return an iterator over the values of a dictionary."""
251 return iter(getattr(d, _itervalues)())
252
254 """Return an iterator over the (key, value) pairs of a dictionary."""
255 return iter(getattr(d, _iteritems)())
256
257
258 if PY3:
260 return s.encode("latin-1")
263 if sys.version_info[1] <= 1:
266 else:
267
268 int2byte = operator.methodcaller("to_bytes", 1, "big")
269 import io
270 StringIO = io.StringIO
271 BytesIO = io.BytesIO
272 else:
276 return unicode(s, "unicode_escape")
277 int2byte = chr
278 import StringIO
279 StringIO = BytesIO = StringIO.StringIO
280 _add_doc(b, """Byte literal""")
281 _add_doc(u, """Text literal""")
282
283
284 if PY3:
285 import builtins
286 exec_ = getattr(builtins, "exec")
287
288
290 if value.__traceback__ is not tb:
291 raise value.with_traceback(tb)
292 raise value
293
294
295 print_ = getattr(builtins, "print")
296 del builtins
297
298 else:
299 - def exec_(code, globs=None, locs=None):
300 """Execute code in a namespace."""
301 if globs is None:
302 frame = sys._getframe(1)
303 globs = frame.f_globals
304 if locs is None:
305 locs = frame.f_locals
306 del frame
307 elif locs is None:
308 locs = globs
309 exec("""exec code in globs, locs""")
310
311
312 exec_("""def reraise(tp, value, tb=None):
313 raise tp, value, tb
314 """)
315
316
318 """The new-style print function."""
319 fp = kwargs.pop("file", sys.stdout)
320 if fp is None:
321 return
322 def write(data):
323 if not isinstance(data, basestring):
324 data = str(data)
325 fp.write(data)
326 want_unicode = False
327 sep = kwargs.pop("sep", None)
328 if sep is not None:
329 if isinstance(sep, unicode):
330 want_unicode = True
331 elif not isinstance(sep, str):
332 raise TypeError("sep must be None or a string")
333 end = kwargs.pop("end", None)
334 if end is not None:
335 if isinstance(end, unicode):
336 want_unicode = True
337 elif not isinstance(end, str):
338 raise TypeError("end must be None or a string")
339 if kwargs:
340 raise TypeError("invalid keyword arguments to print()")
341 if not want_unicode:
342 for arg in args:
343 if isinstance(arg, unicode):
344 want_unicode = True
345 break
346 if want_unicode:
347 newline = unicode("\n")
348 space = unicode(" ")
349 else:
350 newline = "\n"
351 space = " "
352 if sep is None:
353 sep = space
354 if end is None:
355 end = newline
356 for i, arg in enumerate(args):
357 if i:
358 write(sep)
359 write(arg)
360 write(end)
361
362 _add_doc(reraise, """Reraise an exception.""")
363
364
368