diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index c37dae4ae3194..e5779b8578889 100644 --- a/pandas/compat/__init__.py +++ b/pandas/compat/__init__.py @@ -24,8 +24,6 @@ import platform import types import struct -import inspect -from collections import namedtuple PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] >= 3 @@ -64,32 +62,6 @@ def str_to_bytes(s, encoding=None): def bytes_to_str(b, encoding=None): return b.decode(encoding or 'utf-8') - # The signature version below is directly copied from Django, - # https://github.com/django/django/pull/4846 - def signature(f): - sig = inspect.signature(f) - args = [ - p.name for p in sig.parameters.values() - if p.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD - ] - varargs = [ - p.name for p in sig.parameters.values() - if p.kind == inspect.Parameter.VAR_POSITIONAL - ] - varargs = varargs[0] if varargs else None - keywords = [ - p.name for p in sig.parameters.values() - if p.kind == inspect.Parameter.VAR_KEYWORD - ] - keywords = keywords[0] if keywords else None - defaults = [ - p.default for p in sig.parameters.values() - if p.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD - and p.default is not p.empty - ] or None - argspec = namedtuple('Signature', ['args', 'defaults', - 'varargs', 'keywords']) - return argspec(args, defaults, varargs, keywords) else: # Python 2 _name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$") @@ -103,9 +75,6 @@ def str_to_bytes(s, encoding='ascii'): def bytes_to_str(b, encoding='ascii'): return b - def signature(f): - return inspect.getargspec(f) - if PY2: def iteritems(obj, **kw): return obj.iteritems(**kw) diff --git a/pandas/core/apply.py b/pandas/core/apply.py index db86a194ba709..3099548afe787 100644 --- a/pandas/core/apply.py +++ b/pandas/core/apply.py @@ -1,9 +1,9 @@ +import inspect import warnings import numpy as np from pandas._libs import reduction -import pandas.compat as compat from pandas.util._decorators import cache_readonly from pandas.core.dtypes.common import ( @@ -123,7 +123,7 @@ def get_result(self): # Some methods (shift, etc.) require the axis argument, others # don't, so inspect and insert if necessary. func = getattr(self.obj, self.f) - sig = compat.signature(func) + sig = inspect.getfullargspec(func) if 'axis' in sig.args: self.kwds['axis'] = self.axis return func(*self.args, **self.kwds) diff --git a/pandas/tests/reductions/test_stat_reductions.py b/pandas/tests/reductions/test_stat_reductions.py index 11ecd03f6c7e1..e1d48ee82122c 100644 --- a/pandas/tests/reductions/test_stat_reductions.py +++ b/pandas/tests/reductions/test_stat_reductions.py @@ -2,6 +2,7 @@ """ Tests for statistical reductions of 2nd moment or higher: var, skew, kurt, ... """ +import inspect import numpy as np import pytest @@ -10,7 +11,7 @@ import pandas.util._test_decorators as td import pandas as pd -from pandas import DataFrame, Series, compat +from pandas import DataFrame, Series import pandas.util.testing as tm @@ -75,7 +76,7 @@ def _check_stat_op(self, name, alternate, string_series_, f(string_series_, axis=1) # Unimplemented numeric_only parameter. - if 'numeric_only' in compat.signature(f).args: + if 'numeric_only' in inspect.getfullargspec(f).args: with pytest.raises(NotImplementedError, match=name): f(string_series_, numeric_only=True) diff --git a/pandas/util/_decorators.py b/pandas/util/_decorators.py index c3e127a673ac6..679bf086c65b9 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -4,7 +4,6 @@ import warnings from pandas._libs.properties import cache_readonly # noqa -from pandas.compat import signature def deprecate(name, alternative, version, alt_name=None, @@ -335,7 +334,7 @@ def make_signature(func): (['a', 'b', 'c=2'], ['a', 'b', 'c']) """ - spec = signature(func) + spec = inspect.getfullargspec(func) if spec.defaults is None: n_wo_defaults = len(spec.args) defaults = ('',) * n_wo_defaults @@ -347,6 +346,6 @@ def make_signature(func): args.append(var if default == '' else var + '=' + repr(default)) if spec.varargs: args.append('*' + spec.varargs) - if spec.keywords: - args.append('**' + spec.keywords) + if spec.varkw: + args.append('**' + spec.varkw) return args, spec.args diff --git a/scripts/validate_docstrings.py b/scripts/validate_docstrings.py index 1c45c79ba7fba..1173b34b2e430 100755 --- a/scripts/validate_docstrings.py +++ b/scripts/validate_docstrings.py @@ -50,7 +50,6 @@ sys.path.insert(0, os.path.join(BASE_PATH)) import pandas -from pandas.compat import signature sys.path.insert(1, os.path.join(BASE_PATH, 'doc', 'sphinxext')) from numpydoc.docscrape import NumpyDocString @@ -420,7 +419,7 @@ def signature_parameters(self): # accessor classes have a signature but don't want to show this return tuple() try: - sig = signature(self.obj) + sig = inspect.getfullargspec(self.obj) except (TypeError, ValueError): # Some objects, mainly in C extensions do not support introspection # of the signature @@ -428,8 +427,8 @@ def signature_parameters(self): params = sig.args if sig.varargs: params.append("*" + sig.varargs) - if sig.keywords: - params.append("**" + sig.keywords) + if sig.varkw: + params.append("**" + sig.varkw) params = tuple(params) if params and params[0] in ('self', 'cls'): return params[1:]