##// END OF EJS Templates
back to development
back to development

File last commit:

r15146:9bd3a1d4
r18097:f2d639d9
Show More
py3compat.py
264 lines | 8.0 KiB | text/x-python | PythonLexer
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740 # coding: utf-8
"""Compatibility tricks for Python 3. Mainly to do with unicode."""
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 import functools
Thomas Kluyver
Python 3 compatibility for os.getcwdu()
r13447 import os
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 import sys
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890 import re
Thomas Kluyver
Fix various problems highlighted by the test suite.
r4759 import types
Brandon Parsons
Feedback from pull request #1245
r6655
Brandon Parsons
saner default encoding mechanism
r6716 from .encoding import DEFAULT_ENCODING
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Thomas Kluyver
Add simple implementation of Python 3 style open()
r4743 orig_open = open
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 def no_code(x, encoding=None):
return x
def decode(s, encoding=None):
Brandon Parsons
saner default encoding mechanism
r6716 encoding = encoding or DEFAULT_ENCODING
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 return s.decode(encoding, "replace")
def encode(u, encoding=None):
Brandon Parsons
saner default encoding mechanism
r6716 encoding = encoding or DEFAULT_ENCODING
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 return u.encode(encoding, "replace")
Brandon Parsons
pythonw in py3k sets std{in,out,err} to None...
r6651
Thomas Kluyver
Start using py3compat module.
r4731 def cast_unicode(s, encoding=None):
if isinstance(s, bytes):
return decode(s, encoding)
return s
def cast_bytes(s, encoding=None):
if not isinstance(s, bytes):
return encode(s, encoding)
return s
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 def _modify_str_or_docstring(str_change_func):
@functools.wraps(str_change_func)
def wrapper(func_or_str):
Thomas Kluyver
Replace references to unicode and basestring
r13353 if isinstance(func_or_str, string_types):
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 func = None
doc = func_or_str
else:
func = func_or_str
doc = func.__doc__
doc = str_change_func(doc)
if func:
func.__doc__ = doc
return func
return doc
return wrapper
MinRK
move safe_unicode to py3compat
r10635 def safe_unicode(e):
"""unicode(e) with various fallbacks. Used for exceptions, which may not be
safe to call unicode() on.
"""
try:
Thomas Kluyver
Replace references to unicode and basestring
r13353 return unicode_type(e)
MinRK
move safe_unicode to py3compat
r10635 except UnicodeError:
pass
try:
rossant
Fixed name error bug in function safe_unicode in module py3compat.
r12327 return str_to_unicode(str(e))
MinRK
move safe_unicode to py3compat
r10635 except UnicodeError:
pass
try:
rossant
Fixed name error bug in function safe_unicode in module py3compat.
r12327 return str_to_unicode(repr(e))
MinRK
move safe_unicode to py3compat
r10635 except UnicodeError:
pass
return u'Unrecoverably corrupt evalue'
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 if sys.version_info[0] >= 3:
PY3 = True
MinRK
always point py3compat.input to builtin_mod.input...
r14895 # keep reference to builtin_mod because the kernel overrides that value
# to forward requests to a frontend.
def input(prompt=''):
return builtin_mod.input(prompt)
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 builtin_mod_name = "builtins"
Thomas Kluyver
Fix imports of builtins module
r13351 import builtins as builtin_mod
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
str_to_unicode = no_code
unicode_to_str = no_code
str_to_bytes = encode
bytes_to_str = decode
Thomas Kluyver
Fixes for UltraTB and PyColorize with Python 3
r4758 cast_bytes_py2 = no_code
Thomas Kluyver
Fix ``%history -f foo`` in kernel....
r13893 cast_unicode_py2 = no_code
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Thomas Kluyver
Fix 'Custom Display Logic' example notebook for Python 3
r9197 string_types = (str,)
Thomas Kluyver
Specify unicode type properly in rmagic
r13153 unicode_type = str
Thomas Kluyver
Fix 'Custom Display Logic' example notebook for Python 3
r9197
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740 def isidentifier(s, dotted=False):
if dotted:
return all(isidentifier(a) for a in s.split("."))
return s.isidentifier()
Thomas Kluyver
Add simple implementation of Python 3 style open()
r4743
open = orig_open
Thomas Kluyver
Fix references to xrange
r13356 xrange = range
Thomas Kluyver
Fix tests in utils
r13373 def iteritems(d): return iter(d.items())
def itervalues(d): return iter(d.values())
Thomas Kluyver
Python 3 compatibility for os.getcwdu()
r13447 getcwd = os.getcwd
Thomas Kluyver
Fix various problems highlighted by the test suite.
r4759
MethodType = types.MethodType
MinRK
don't override execfile on Python 2
r4780
def execfile(fname, glob, loc=None):
loc = loc if (loc is not None) else glob
Bradley M. Froehle
Fix Python 3.2 test failures (ResourceWarnings from unclosed files)....
r7803 with open(fname, 'rb') as f:
Thomas Kluyver
Fix exec statements for Py 3...
r13350 exec(compile(f.read(), fname, 'exec'), glob, loc)
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890
# Refactor print statements in doctests.
_print_statement_re = re.compile(r"\bprint (?P<expr>.*)$", re.MULTILINE)
def _print_statement_sub(match):
expr = match.groups('expr')
return "print(%s)" % expr
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894
@_modify_str_or_docstring
def doctest_refactor_print(doc):
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890 """Refactor 'print x' statements in a doctest to print(x) style. 2to3
unfortunately doesn't pick up on our doctests.
Can accept a string or a function, so it can be used as a decorator."""
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 return _print_statement_re.sub(_print_statement_sub, doc)
# Abstract u'abc' syntax:
@_modify_str_or_docstring
def u_format(s):
""""{u}'abc'" --> "'abc'" (Python 3)
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 Accepts a string or a function, so it can be used as a decorator."""
return s.format(u='')
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 else:
PY3 = False
MinRK
always point py3compat.input to builtin_mod.input...
r14895 # keep reference to builtin_mod because the kernel overrides that value
# to forward requests to a frontend.
def input(prompt=''):
return builtin_mod.raw_input(prompt)
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 builtin_mod_name = "__builtin__"
Thomas Kluyver
Fix imports of builtins module
r13351 import __builtin__ as builtin_mod
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
str_to_unicode = decode
unicode_to_str = encode
str_to_bytes = no_code
bytes_to_str = no_code
Thomas Kluyver
Fixes for UltraTB and PyColorize with Python 3
r4758 cast_bytes_py2 = cast_bytes
Thomas Kluyver
Fix ``%history -f foo`` in kernel....
r13893 cast_unicode_py2 = cast_unicode
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740
Thomas Kluyver
Fix 'Custom Display Logic' example notebook for Python 3
r9197 string_types = (str, unicode)
Thomas Kluyver
Specify unicode type properly in rmagic
r13153 unicode_type = unicode
Thomas Kluyver
Fix 'Custom Display Logic' example notebook for Python 3
r9197
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740 import re
_name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$")
def isidentifier(s, dotted=False):
if dotted:
return all(isidentifier(a) for a in s.split("."))
return bool(_name_re.match(s))
Thomas Kluyver
Add simple implementation of Python 3 style open()
r4743
class open(object):
"""Wrapper providing key part of Python 3 open() interface."""
def __init__(self, fname, mode="r", encoding="utf-8"):
self.f = orig_open(fname, mode)
self.enc = encoding
def write(self, s):
return self.f.write(s.encode(self.enc))
def read(self, size=-1):
return self.f.read(size).decode(self.enc)
def close(self):
return self.f.close()
def __enter__(self):
return self
def __exit__(self, etype, value, traceback):
self.f.close()
Thomas Kluyver
Fix various problems highlighted by the test suite.
r4759
Thomas Kluyver
Fix references to xrange
r13356 xrange = xrange
Thomas Kluyver
Fix tests in utils
r13373 def iteritems(d): return d.iteritems()
def itervalues(d): return d.itervalues()
Thomas Kluyver
Python 3 compatibility for os.getcwdu()
r13447 getcwd = os.getcwdu
Thomas Kluyver
Fix references to xrange
r13356
Thomas Kluyver
Fix various problems highlighted by the test suite.
r4759 def MethodType(func, instance):
return types.MethodType(func, instance, type(instance))
MinRK
don't override execfile on Python 2
r4780
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890 def doctest_refactor_print(func_or_str):
return func_or_str
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Jörgen Stenarson
fix for execfile that does not tolerate non-ascii characters in filename.
r5089
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 # Abstract u'abc' syntax:
@_modify_str_or_docstring
def u_format(s):
""""{u}'abc'" --> "u'abc'" (Python 2)
Accepts a string or a function, so it can be used as a decorator."""
return s.format(u='u')
Jörgen Stenarson
fix for execfile that does not tolerate non-ascii characters in filename.
r5089
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 if sys.platform == 'win32':
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 def execfile(fname, glob=None, loc=None):
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 loc = loc if (loc is not None) else glob
Fernando Perez
Work around issue in py2.6 where trailing whitespace confuses compile()....
r5380 # The rstrip() is necessary b/c trailing whitespace in files will
# cause an IndentationError in Python 2.6 (this was fixed in 2.7,
# but we still support 2.6). See issue 1027.
Thomas Kluyver
Fix imports of builtins module
r13351 scripttext = builtin_mod.open(fname).read().rstrip() + '\n'
Thomas Kluyver
Fix execfile compatibility layer for Python 2 on non-Windows platforms.
r5133 # compile converts unicode filename to str assuming
# ascii. Let's do the conversion before calling compile
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 if isinstance(fname, unicode):
filename = unicode_to_str(fname)
else:
filename = fname
Thomas Kluyver
Fix exec statements for Py 3...
r13350 exec(compile(scripttext, filename, 'exec'), glob, loc)
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 else:
Thomas Kluyver
Fix execfile compatibility layer for Python 2 on non-Windows platforms.
r5133 def execfile(fname, *where):
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 if isinstance(fname, unicode):
filename = fname.encode(sys.getfilesystemencoding())
else:
filename = fname
Thomas Kluyver
Fix imports of builtins module
r13351 builtin_mod.execfile(filename, *where)
Thomas Kluyver
Fixes for metaclass syntax
r13359
MinRK
move @annotate to py3compat
r15146
def annotate(**kwargs):
"""Python 3 compatible function annotation for Python 2."""
if not kwargs:
raise ValueError('annotations must be provided as keyword arguments')
def dec(f):
if hasattr(f, '__annotations__'):
for k, v in kwargs.items():
f.__annotations__[k] = v
else:
f.__annotations__ = kwargs
return f
return dec
Thomas Kluyver
Fixes for metaclass syntax
r13359 # Parts below taken from six:
# Copyright (c) 2010-2013 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.
def with_metaclass(meta, *bases):
"""Create a base class with a metaclass."""
Thomas Kluyver
Hide dynamically defined metaclass base from Sphinx....
r13584 return meta("_NewBase", bases, {})