diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-05-23 13:02:33 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-05-23 13:02:33 -0400 |
commit | 6e99c0b04e43d1c24ae79a52b225788e6e966abc (patch) | |
tree | 47324d5d8ddaf8fa7e728c2bae1d1721e4582c05 /lib/sqlalchemy/util/langhelpers.py | |
parent | 2e75f668f3844a90c2d15e5bd36f927b329f47a6 (diff) | |
parent | 2eaae08f4845460f27c7bb96f5b26d31f35b0e77 (diff) | |
download | sqlalchemy-6e99c0b04e43d1c24ae79a52b225788e6e966abc.tar.gz |
merge default
Diffstat (limited to 'lib/sqlalchemy/util/langhelpers.py')
-rw-r--r-- | lib/sqlalchemy/util/langhelpers.py | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py index 4cb745c2b..b0ff5b073 100644 --- a/lib/sqlalchemy/util/langhelpers.py +++ b/lib/sqlalchemy/util/langhelpers.py @@ -148,7 +148,7 @@ class PluginLoader(object): self.impls[name] = load -def get_cls_kwargs(cls): +def get_cls_kwargs(cls, _set=None): """Return the full set of inherited kwargs for the given `cls`. Probes a class's __init__ method, collecting all named arguments. If the @@ -160,33 +160,31 @@ def get_cls_kwargs(cls): No anonymous tuple arguments please ! """ + toplevel = _set == None + if toplevel: + _set = set() - for c in cls.__mro__: - if '__init__' in c.__dict__: - stack = set([c]) - break - else: - return [] - - args = set() - while stack: - class_ = stack.pop() - ctr = class_.__dict__.get('__init__', False) - if (not ctr or - not isinstance(ctr, types.FunctionType) or - not isinstance(ctr.__code__, types.CodeType)): - stack.update(class_.__bases__) - continue + ctr = cls.__dict__.get('__init__', False) - # this is shorthand for - # names, _, has_kw, _ = inspect.getargspec(ctr) + has_init = ctr and isinstance(ctr, types.FunctionType) and \ + isinstance(ctr.__code__, types.CodeType) + if has_init: names, has_kw = inspect_func_args(ctr) - args.update(names) - if has_kw: - stack.update(class_.__bases__) - args.discard('self') - return args + _set.update(names) + + if not has_kw and not toplevel: + return None + + if not has_init or has_kw: + for c in cls.__bases__: + if get_cls_kwargs(c, _set) is None: + break + + _set.discard('self') + return _set + + try: from inspect import CO_VARKEYWORDS |