py36 = sys.version_info >= (3, 6)
py33 = sys.version_info >= (3, 3)
+py35 = sys.version_info >= (3, 5)
py32 = sys.version_info >= (3, 2)
py3k = sys.version_info >= (3, 0)
py2k = sys.version_info < (3, 0)
itertools_imap = itertools.imap
from itertools import izip_longest as zip_longest
+if py35:
+ from inspect import formatannotation
+
+ def inspect_formatargspec(
+ args, varargs=None, varkw=None, defaults=None,
+ kwonlyargs=(), kwonlydefaults={}, annotations={},
+ formatarg=str,
+ formatvarargs=lambda name: '*' + name,
+ formatvarkw=lambda name: '**' + name,
+ formatvalue=lambda value: '=' + repr(value),
+ formatreturns=lambda text: ' -> ' + text,
+ formatannotation=formatannotation):
+ """Copy formatargspec from python 3.7 standard library.
+
+ Python 3 has deprecated formatargspec and requested that Signature
+ be used instead, however this requires a full reimplementation
+ of formatargspec() in terms of creating Parameter objects and such.
+ Instead of introducing all the object-creation overhead and having
+ to reinvent from scratch, just copy their compatibility routine.
+
+ Utimately we would need to rewrite our "decorator" routine completely
+ which is not really worth it right now, until all Python 2.x support
+ is dropped.
+
+ """
+
+ def formatargandannotation(arg):
+ result = formatarg(arg)
+ if arg in annotations:
+ result += ': ' + formatannotation(annotations[arg])
+ return result
+ specs = []
+ if defaults:
+ firstdefault = len(args) - len(defaults)
+ for i, arg in enumerate(args):
+ spec = formatargandannotation(arg)
+ if defaults and i >= firstdefault:
+ spec = spec + formatvalue(defaults[i - firstdefault])
+ specs.append(spec)
+ if varargs is not None:
+ specs.append(formatvarargs(formatargandannotation(varargs)))
+ else:
+ if kwonlyargs:
+ specs.append('*')
+ if kwonlyargs:
+ for kwonlyarg in kwonlyargs:
+ spec = formatargandannotation(kwonlyarg)
+ if kwonlydefaults and kwonlyarg in kwonlydefaults:
+ spec += formatvalue(kwonlydefaults[kwonlyarg])
+ specs.append(spec)
+ if varkw is not None:
+ specs.append(formatvarkw(formatargandannotation(varkw)))
+ result = '(' + ', '.join(specs) + ')'
+ if 'return' in annotations:
+ result += formatreturns(formatannotation(annotations['return']))
+ return result
+
+else:
+ from inspect import formatargspec as inspect_formatargspec
+
+
import time
if win32 or jython:
return metaclass('temporary_class', None, {})
-
-
@contextmanager
def nested(*managers):
"""Implement contextlib.nested, mostly for unit tests.
modules, classes, hierarchies, attributes, functions, and methods.
"""
-import itertools
import inspect
+import itertools
import operator
import re
import sys
except ImportError:
def inspect_func_args(fn):
- names, _, has_kw, _ = inspect.getargspec(fn)
+ names, _, has_kw, _ = compat.inspect_getargspec(fn)
return names, bool(has_kw)
else:
# we accept an existing argspec...
spec = fn
- args = inspect.formatargspec(*spec)
+ args = compat.inspect_formatargspec(*spec)
if spec[0]:
self_arg = spec[0][0]
elif spec[1]:
self_arg = None
if compat.py3k:
- apply_pos = inspect.formatargspec(spec[0], spec[1],
- spec[2], None, spec[4])
+ apply_pos = compat.inspect_formatargspec(
+ spec[0], spec[1], spec[2], None, spec[4])
num_defaults = 0
if spec[3]:
num_defaults += len(spec[3])
num_defaults += len(spec[4])
name_args = spec[0] + spec[4]
else:
- apply_pos = inspect.formatargspec(spec[0], spec[1], spec[2])
+ apply_pos = compat.inspect_formatargspec(spec[0], spec[1], spec[2])
num_defaults = 0
if spec[3]:
num_defaults += len(spec[3])
else:
defaulted_vals = ()
- apply_kw = inspect.formatargspec(name_args, spec[1], spec[2],
- defaulted_vals,
- formatvalue=lambda x: '=' + x)
+ apply_kw = compat.inspect_formatargspec(
+ name_args, spec[1], spec[2], defaulted_vals,
+ formatvalue=lambda x: '=' + x)
if grouped:
return dict(args=args, self_arg=self_arg,
apply_pos=apply_pos, apply_kw=apply_kw)
continue
try:
spec = compat.inspect_getargspec(fn)
- fn_args = inspect.formatargspec(spec[0])
- d_args = inspect.formatargspec(spec[0][1:])
+ fn_args = compat.inspect_formatargspec(spec[0])
+ d_args = compat.inspect_formatargspec(spec[0][1:])
except TypeError:
fn_args = '(self, *args, **kw)'
d_args = '(*args, **kw)'