Skip to content

Commit

Permalink
Use inspect.signature() for Python3 and up
Browse files Browse the repository at this point in the history
`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
  • Loading branch information
13steinj committed Nov 23, 2015
1 parent 734a82a commit 5f1001e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
10 changes: 5 additions & 5 deletions praw/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand Down
13 changes: 13 additions & 0 deletions praw/internal.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"""

from __future__ import print_function, unicode_literals
import inspect
import re
import six
import sys
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 5f1001e

Please sign in to comment.