summaryrefslogtreecommitdiffstats
path: root/netaddr/compat.py
diff options
context:
space:
mode:
Diffstat (limited to 'netaddr/compat.py')
-rw-r--r--netaddr/compat.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/netaddr/compat.py b/netaddr/compat.py
new file mode 100644
index 0000000..33e4b9c
--- /dev/null
+++ b/netaddr/compat.py
@@ -0,0 +1,100 @@
+#-----------------------------------------------------------------------------
+# Copyright (c) 2008 by David P. D. Moss. All rights reserved.
+#
+# Released under the BSD license. See the LICENSE file for details.
+#-----------------------------------------------------------------------------
+"""
+Compatibility wrappers providing uniform behaviour for Python code required to
+run under both Python 2.x and 3.x.
+
+All operations emulate 2.x behaviour where applicable.
+"""
+import sys as _sys
+
+if _sys.version_info[0] == 3:
+ # Python 3.x specific logic.
+ _sys_maxint = _sys.maxsize
+
+ _int_type = int
+
+ _str_type = str
+
+ _bytes_type = lambda x: bytes(x, 'UTF-8')
+
+ _is_str = lambda x: isinstance(x, (str, type(''.encode())))
+
+ _is_int = lambda x: isinstance(x, int)
+
+ _callable = lambda x: hasattr(x, '__call__')
+
+ _dict_keys = lambda x: list(x.keys())
+
+ _dict_items = lambda x: list(x.items())
+
+ _iter_dict_keys = lambda x: x.keys()
+
+ def _bytes_join(*args):
+ return ''.encode().join(*args)
+
+ def _zip(*args):
+ return list(zip(*args))
+
+ def _range(*args, **kwargs):
+ return list(range(*args, **kwargs))
+
+ _iter_range = range
+
+ def _iter_next(x):
+ return next(x)
+
+elif _sys.version_info[0:2] > [2, 3]:
+ # Python 2.4 or higher.
+ _sys_maxint = _sys.maxint
+
+ _int_type = (int, long)
+
+ _str_type = basestring
+
+ _bytes_type = str
+
+ _is_str = lambda x: isinstance(x, basestring)
+
+ _is_int = lambda x: isinstance(x, (int, long))
+
+ _callable = lambda x: callable(x)
+
+ _dict_keys = lambda x: x.keys()
+
+ _dict_items = lambda x: x.items()
+
+ _iter_dict_keys = lambda x: iter(x.keys())
+
+ def _bytes_join(*args):
+ return ''.join(*args)
+
+ def _zip(*args):
+ return zip(*args)
+
+ def _range(*args, **kwargs):
+ return range(*args, **kwargs)
+
+ _iter_range = xrange
+
+ def _iter_next(x):
+ return x.next()
+else:
+ # Unsupported versions.
+ raise RuntimeError(
+ 'this module only supports Python 2.4.x or higher (including 3.x)!')
+
+try:
+ from importlib import resources as _importlib_resources
+except ImportError:
+ import importlib_resources as _importlib_resources
+
+
+if hasattr(_importlib_resources, 'files'):
+ def _open_binary(pkg, res):
+ return _importlib_resources.files(pkg).joinpath(res).open('rb')
+else:
+ _open_binary = _importlib_resources.open_binary