summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util/langhelpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/util/langhelpers.py')
-rw-r--r--lib/sqlalchemy/util/langhelpers.py23
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py
index 1ff868e01..191474576 100644
--- a/lib/sqlalchemy/util/langhelpers.py
+++ b/lib/sqlalchemy/util/langhelpers.py
@@ -342,16 +342,22 @@ def unbound_method_to_callable(func_or_cls):
return func_or_cls
-def generic_repr(obj, additional_kw=(), to_inspect=None):
+def generic_repr(obj, to_inspect=None):
"""Produce a __repr__() based on direct association of the __init__()
specification vs. same-named attributes present.
"""
- if to_inspect is None:
- to_inspect = obj
-
missing = object()
+ # if a type uses **kwargs, it should give tuples of its expected
+ # argument names and default values in __kwargs_signature__
+ additional_kw = getattr(obj, "__kwargs_signature__", ())
+ if to_inspect:
+ if hasattr(to_inspect, "__kwargs_signature__"):
+ additional_kw += getattr(to_inspect, "__kwargs_signature__")
+ else:
+ to_inspect = obj
+
def genargs():
try:
(args, vargs, vkw, defaults) = \
@@ -364,8 +370,6 @@ def generic_repr(obj, additional_kw=(), to_inspect=None):
if not default_len:
for arg in args[1:]:
yield repr(getattr(obj, arg, None))
- if vargs is not None and hasattr(obj, vargs):
- yield ', '.join(repr(val) for val in getattr(obj, vargs))
else:
for arg in args[1:-default_len]:
yield repr(getattr(obj, arg, None))
@@ -376,7 +380,10 @@ def generic_repr(obj, additional_kw=(), to_inspect=None):
yield '%s=%r' % (arg, val)
except:
pass
- if additional_kw:
+ if vargs is not None:
+ if hasattr(obj, vargs):
+ yield ', '.join(repr(val) for val in getattr(obj, vargs))
+ if len(additional_kw):
for arg, defval in additional_kw:
try:
val = getattr(obj, arg, missing)
@@ -384,7 +391,7 @@ def generic_repr(obj, additional_kw=(), to_inspect=None):
yield '%s=%r' % (arg, val)
except:
pass
-
+
return "%s(%s)" % (obj.__class__.__name__, ", ".join(genargs()))