From 5f1001e200f95f0448ffcd7c41b750a7a1fc8121 Mon Sep 17 00:00:00 2001 From: 13steinj <13steinj@users.noreply.github.com> Date: Sun, 22 Nov 2015 12:06:17 -0500 Subject: [PATCH] Use inspect.signature() for Python3 and up `inspect.getargspec()` is soon to be deprecated in favor of `inspect.signature()`. `inspect.signature` was not backported for Python2, so we will keep using `inspect.getargspec()` for that. Resolves #541 --- praw/decorators.py | 10 +++++----- praw/internal.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/praw/decorators.py b/praw/decorators.py index 41d366f718..d9f9c82430 100644 --- a/praw/decorators.py +++ b/praw/decorators.py @@ -24,11 +24,11 @@ from __future__ import print_function, unicode_literals import decorator -import inspect import six import sys from functools import wraps from praw.decorator_helpers import _get_captcha, _is_mod_of_all +from praw.internal import _make_func_args from praw import errors from warnings import simplefilter, warn @@ -48,7 +48,7 @@ def alias_function(function, class_name): """ @wraps(function) def wrapped(self, *args, **kwargs): - func_args = inspect.getargspec(function).args + func_args = _make_func_args(function) if 'subreddit' in func_args and func_args.index('subreddit') != 1: # Only happens for search kwargs['subreddit'] = self @@ -164,9 +164,9 @@ def require_captcha(function, *args, **kwargs): # *args currently contains a None where the captcha answer # needs to go. If we put the captcha in the **kwargs, # we get a TypeError for having two values of the same param. - func_args = inspect.getargspec(function) - if 'captcha' in func_args.args: - captcha_index = func_args.args.index('captcha') + func_args = _make_func_args(function) + if 'captcha' in func_args: + captcha_index = func_args.index('captcha') args = list(args) args[captcha_index] = captcha_answer else: diff --git a/praw/internal.py b/praw/internal.py index 3f46a95259..b9e76ba863 100644 --- a/praw/internal.py +++ b/praw/internal.py @@ -19,6 +19,7 @@ """ from __future__ import print_function, unicode_literals +import inspect import re import six import sys @@ -75,6 +76,18 @@ def _sorted(self, *args, **kwargs): return _sorted +def _make_func_args(function): + if six.PY3 and not hasattr(sys, 'pypy_version_info'): + # CPython3 uses inspect.signature(), not inspect.getargspec() + # see #551 and #541 for more info + func_items = inspect.signature(function).parameters.items() + func_args = [name for name, param in func_items + if param.kind == param.POSITIONAL_OR_KEYWORD] + else: + func_args = inspect.getargspec(function).args + return func_args + + def _modify_relationship(relationship, unlink=False, is_sub=False): """Return a function for relationship modification.