John Vandenberg has uploaded a new change for review. https://gerrit.wikimedia.org/r/175419
Change subject: Set __signature__ in decorators ...................................................................... Set __signature__ in decorators PEP 362 introduces __signature__ for functions as a way to alter function arguments in a decorator in a way that can be reliably inspected. It is implemented in Python 3.4, and back ports are available. Sphinx 1.3 on Python 3.4 uses the inspect module to automatically describe function arguments, allowing documentation to be accurate even in the presence of decorators. deprecated_args updates the signature to include the deprecated arguments, either providing a note in the default value, or a default of NotImplemented if there is no substitute argument. Change-Id: I2aeef8c8f31cdb01f18e199834b2f1a8ef8b043c --- M pywikibot/site.py M pywikibot/tools.py 2 files changed, 24 insertions(+), 1 deletion(-) git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core refs/changes/19/175419/1 diff --git a/pywikibot/site.py b/pywikibot/site.py index 1e6e614..2a55df6 100644 --- a/pywikibot/site.py +++ b/pywikibot/site.py @@ -30,7 +30,7 @@ from pywikibot.tools import ( itergroup, deprecated, deprecate_arg, UnicodeMixin, ComparableMixin, redirect_func, add_decorated_full_name, deprecated_args, - SelfCallDict, SelfCallString, + SelfCallDict, SelfCallString, signature, ) from pywikibot.tools import MediaWikiVersion as LV from pywikibot.throttle import Throttle @@ -973,6 +973,7 @@ if not hasattr(fn, '__full_name__'): add_decorated_full_name(fn) callee.__full_name__ = fn.__full_name__ + callee.__signature__ = signature(fn) return callee return decorator @@ -1001,6 +1002,7 @@ callee.__name__ = fn.__name__ callee.__doc__ = fn.__doc__ callee.__module__ = fn.__module__ + callee.__signature__ = signature(fn) if not hasattr(fn, '__full_name__'): add_decorated_full_name(fn) callee.__full_name__ = fn.__full_name__ diff --git a/pywikibot/tools.py b/pywikibot/tools.py index d71ad8a..777149b 100644 --- a/pywikibot/tools.py +++ b/pywikibot/tools.py @@ -456,6 +456,12 @@ # only one arg, and that arg be a callable, as it will be detected as # a deprecator without any arguments. +# Use a dummy function if inspect.signature (PEP 362; py 3.4) does not exist. +if 'signature' in inspect.__dict__: + signature = inspect.signature +else: + signature = lambda x: None + def add_decorated_full_name(obj): """Extract full object name, including class, and store in __full_name__. @@ -527,6 +533,7 @@ inner_wrapper.__doc__ = obj.__doc__ inner_wrapper.__name__ = obj.__name__ inner_wrapper.__module__ = obj.__module__ + inner_wrapper.__signature__ = signature(obj) # The decorator being decorated may have args, so both # syntax need to be supported. @@ -581,6 +588,7 @@ wrapper.__doc__ = obj.__doc__ wrapper.__name__ = obj.__name__ wrapper.__module__ = obj.__module__ + wrapper.__signature__ = signature(obj) return wrapper without_parameters = len(args) == 1 and len(kwargs) == 0 and callable(args[0]) @@ -662,6 +670,19 @@ wrapper.__doc__ = obj.__doc__ wrapper.__name__ = obj.__name__ wrapper.__module__ = obj.__module__ + wrapper.__signature__ = signature(obj) + if wrapper.__signature__: + # Build a new signature with deprecated args added. + params = collections.OrderedDict() + for param in wrapper.__signature__.parameters.values(): + params[param.name] = param.replace() + for old_arg, new_arg in arg_pairs.items(): + params[old_arg] = inspect.Parameter( + old_arg, kind=inspect._POSITIONAL_OR_KEYWORD, + default='[deprecated name of ' + new_arg + ']' if new_arg + else NotImplemented) + wrapper.__signature__ = inspect.Signature() + wrapper.__signature__._parameters = params if not hasattr(obj, '__full_name__'): add_decorated_full_name(obj) wrapper.__full_name__ = obj.__full_name__ -- To view, visit https://gerrit.wikimedia.org/r/175419 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2aeef8c8f31cdb01f18e199834b2f1a8ef8b043c Gerrit-PatchSet: 1 Gerrit-Project: pywikibot/core Gerrit-Branch: master Gerrit-Owner: John Vandenberg <jay...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits