From 475ad79771a5bfe48b0415dd841e726645ea62bb Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 19 Jan 2017 14:35:01 +0000 Subject: [PATCH] Revert "Use inspect.signature() if available" This change introduces behavior that's not compatible with real world usage of mox3 in the nova project, and breaks huge amounts of the unit tests under python3. Closes-Bug: #1657757 This reverts commit 4a85ff0ec4ceb98ad87bec6002f6e67788b06d00. Change-Id: Iacb0d9307af4602a9e4f5725504f98e196cd10fc --- mox3/mox.py | 75 ++++++++++++----------------------------------------- 1 file changed, 16 insertions(+), 59 deletions(-) diff --git a/mox3/mox.py b/mox3/mox.py index 9034661..85d4e0c 100644 --- a/mox3/mox.py +++ b/mox3/mox.py @@ -905,7 +905,15 @@ class MethodSignatureChecker(object): possible. Some methods and functions like built-ins can't be inspected. """ - + try: + self._args, varargs, varkw, defaults = inspect.getargspec(method) + except TypeError: + raise ValueError('Could not get argument specification for %r' + % (method,)) + if (inspect.ismethod(method) or class_to_bind or ( + hasattr(self, '_args') and len(self._args) > 0 + and self._args[0] == 'self')): + self._args = self._args[1:] # Skip 'self'. self._method = method self._instance = None # May contain the instance this is bound to. self._instance = getattr(method, "__self__", None) @@ -917,65 +925,14 @@ class MethodSignatureChecker(object): self._bounded_to = class_to_bind or getattr(method, "im_class", None) - # inspect.getargspec() is deprecated since Python 3.0, prefer - # inspect.signature() (available since Python 3.3) which supports - # also Python 3 keyword-only arguments. - if hasattr(inspect, 'signature'): - try: - signature = inspect.signature(method) - params = list(signature.parameters.values()) - except TypeError: - raise ValueError('Could not get signature for %r' - % (method,)) - - Parameter = inspect.Parameter - self._has_varargs = any(param.kind == Parameter.VAR_POSITIONAL - for param in params) - self._has_varkw = any(param.kind == Parameter.VAR_KEYWORD - for param in params) - - if (inspect.ismethod(method) or class_to_bind - or (params and params[0].name == 'self')): - params = params[1:] - - # Truncate params at the first *args or **kwargs parameter - for index, param in enumerate(params): - if param.kind in (Parameter.VAR_POSITIONAL, - Parameter.VAR_KEYWORD): - del params[index:] - break - - required = 0 - for param in params: - if param.default is not Parameter.empty: - break - required += 1 - - self._args = [param.name for param in params] - self._required_args = self._args[:required] - self._default_args = self._args[required:] + self._has_varargs = varargs is not None + self._has_varkw = varkw is not None + if defaults is None: + self._required_args = self._args + self._default_args = [] else: - try: - argspec = inspect.getargspec(method) - except TypeError: - raise ValueError('Could not get argument specification for %r' - % (method,)) - - args = argspec.args - if (inspect.ismethod(method) or class_to_bind or ( - args and args[0] == 'self')): - args = args[1:] # Skip 'self'. - - self._has_varargs = (argspec.varargs is not None) - self._has_varkw = (argspec.keywords is not None) - self._args = args - if argspec.defaults: - pos = -len(argspec.defaults) - self._required_args = args[:pos] - self._default_args = args[pos:] - else: - self._required_args = args - self._default_args = [] + self._required_args = self._args[:-len(defaults)] + self._default_args = self._args[-len(defaults):] def _RecordArgumentGiven(self, arg_name, arg_status): """Mark an argument as being given.