diff options
author | Eli Collins <elic@assurancetechnologies.com> | 2016-11-22 19:56:52 -0500 |
---|---|---|
committer | Eli Collins <elic@assurancetechnologies.com> | 2016-11-22 19:56:52 -0500 |
commit | e88bc2e560fae8236db4f3756d8eb3c4f930b20b (patch) | |
tree | 28f5a26aedce39553fa66a5189a5cfc09331c08f | |
parent | 5ef2b07a48c38d56025a5cddd055716140c480bf (diff) | |
download | passlib-e88bc2e560fae8236db4f3756d8eb3c4f930b20b.tar.gz |
passlib.utils: add py3 version of accepts_keyword()
which doesn't use deprecated inspect.getargspec()
-rw-r--r-- | passlib/utils/__init__.py | 28 |
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): |