summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Collins <elic@assurancetechnologies.com>2016-11-22 19:56:52 -0500
committerEli Collins <elic@assurancetechnologies.com>2016-11-22 19:56:52 -0500
commite88bc2e560fae8236db4f3756d8eb3c4f930b20b (patch)
tree28f5a26aedce39553fa66a5189a5cfc09331c08f
parent5ef2b07a48c38d56025a5cddd055716140c480bf (diff)
downloadpasslib-e88bc2e560fae8236db4f3756d8eb3c4f930b20b.tar.gz
passlib.utils: add py3 version of accepts_keyword()
which doesn't use deprecated inspect.getargspec()
-rw-r--r--passlib/utils/__init__.py28
1 files changed, 24 insertions, 4 deletions
diff --git a/passlib/utils/__init__.py b/passlib/utils/__init__.py
index d94af47..1be8a47 100644
--- a/passlib/utils/__init__.py
+++ b/passlib/utils/__init__.py
@@ -157,10 +157,30 @@ class SequenceMixin(object):
def __ne__(self, other):
return not self.__eq__(other)
-def accepts_keyword(func, key):
- """test if function accepts specified keyword"""
- spec = inspect.getargspec(get_method_function(func))
- return key in spec.args or spec.keywords is not None
+if PY3:
+ # getargspec() is deprecated, use this under py3.
+ # even though it's a lot more awkward to get basic info :|
+
+ _VAR_KEYWORD = inspect.Parameter.VAR_KEYWORD
+ _VAR_ANY_SET = set([_VAR_KEYWORD, inspect.Parameter.VAR_POSITIONAL])
+
+ def accepts_keyword(func, key):
+ """test if function accepts specified keyword"""
+ params = inspect.signature(get_method_function(func)).parameters
+ if not params:
+ return False
+ arg = params.get(key)
+ if arg and arg.kind not in _VAR_ANY_SET:
+ return True
+ # XXX: annoying what we have to do to determine if VAR_KWDS in use.
+ return params[list(params)[-1]].kind == _VAR_KEYWORD
+
+else:
+
+ def accepts_keyword(func, key):
+ """test if function accepts specified keyword"""
+ spec = inspect.getargspec(get_method_function(func))
+ return key in spec.args or spec.keywords is not None
def update_mixin_classes(target, add=None, remove=None, append=False,
before=None, after=None, dryrun=False):