diff options
author | Jason Kirtland <jek@discorporate.us> | 2008-08-15 22:28:55 +0000 |
---|---|---|
committer | Jason Kirtland <jek@discorporate.us> | 2008-08-15 22:28:55 +0000 |
commit | d70ed586c74feb947a412f2b5aa1496e11465cdf (patch) | |
tree | 93c113e91c85d96c610d913c1c6ba6c45202baed /lib/sqlalchemy/util.py | |
parent | 2d4908e88cce5b9872f20cac66c66efd3a0c98fd (diff) | |
download | sqlalchemy-d70ed586c74feb947a412f2b5aa1496e11465cdf.tar.gz |
Re-use func_defaults when generating wrapper functions. [ticket:1139]
Diffstat (limited to 'lib/sqlalchemy/util.py')
-rw-r--r-- | lib/sqlalchemy/util.py | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 735843d2d..dd1045311 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -155,6 +155,7 @@ def accepts_a_list_as_starargs(list_deprecation=None): env = locals().copy() exec code in env decorated = env[fn.func_name] + decorated.func_defaults = fn.func_defaults update_wrapper(decorated, fn) decorated.generated_src = code return decorated @@ -188,6 +189,7 @@ def decorator(target): code = 'lambda %(args)s: %(target)s(%(fn)s, %(apply_kw)s)' % ( metadata) decorated = eval(code, {targ_name:target, fn_name:fn}) + decorated.func_defaults = getattr(fn, 'im_func', fn).func_defaults return update_wrapper(decorated, fn) return update_wrapper(decorate, target) @@ -547,7 +549,14 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None, not hasattr(into_cls, m) and m not in skip)] for method in dunders: try: - spec = inspect.getargspec(getattr(from_cls, method)) + fn = getattr(from_cls, method) + if not hasattr(fn, '__call__'): + continue + fn = getattr(fn, 'im_func', fn) + except AttributeError: + continue + try: + spec = inspect.getargspec(fn) fn_args = inspect.formatargspec(spec[0]) d_args = inspect.formatargspec(spec[0][1:]) except TypeError: @@ -559,9 +568,12 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None, env = from_instance is not None and {name: from_instance} or {} exec py in env + try: + env[method].func_defaults = fn.func_defaults + except AttributeError: + pass setattr(into_cls, method, env[method]) - class SimpleProperty(object): """A *default* property accessor.""" |