summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-12-09 14:12:22 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2012-12-09 14:12:22 -0500
commit7443d50d3102e345a367afea9019feb2d8c0c5a3 (patch)
tree23543849dfd8a49cb09c97ba50c18056dc03cd86 /lib/sqlalchemy/util
parentfef25bdcf9cf9f7936a569acd3b9eb850f1c3fd9 (diff)
downloadsqlalchemy-7443d50d3102e345a367afea9019feb2d8c0c5a3.tar.gz
- documentation and changelog for [ticket:2601]
Diffstat (limited to 'lib/sqlalchemy/util')
-rw-r--r--lib/sqlalchemy/util/_collections.py66
1 files changed, 57 insertions, 9 deletions
diff --git a/lib/sqlalchemy/util/_collections.py b/lib/sqlalchemy/util/_collections.py
index 244ed5c5e..af8292806 100644
--- a/lib/sqlalchemy/util/_collections.py
+++ b/lib/sqlalchemy/util/_collections.py
@@ -16,18 +16,39 @@ EMPTY_SET = frozenset()
class KeyedTuple(tuple):
- """tuple() subclass that adds labeled names.
+ """``tuple`` subclass that adds labeled names.
- Unlike collections.namedtuple, this is
- an ad-hoc data structure, not a factory
- for new types.
+ E.g.::
- It's pickleable in-place without the need for stack
- frame manipulation, new KeyedTuple types can be created
- very quickly and simply (look at the source
- to collections.namedtuple for contrast).
+ >>> k = KeyedTuple([1, 2, 3], labels=["one", "two", "three"])
+ >>> k.one
+ 1
+ >>> k.two
+ 2
- Is used by :class:`.Query` to return result rows.
+ Result rows returned by :class:`.Query` that contain multiple
+ ORM entities and/or column expressions make use of this
+ class to return rows.
+
+ The :class:`.KeyedTuple` exhibits similar behavior to the
+ ``collections.namedtuple()`` construct provided in the Python
+ standard library, however is architected very differently.
+ Unlike ``collections.namedtuple()``, :class:`.KeyedTuple` is
+ does not rely on creation of custom subtypes in order to represent
+ a new series of keys, instead each :class:`.KeyedTuple` instance
+ receives its list of keys in place. The subtype approach
+ of ``collections.namedtuple()`` introduces significant complexity
+ and performance overhead, which is not necessary for the
+ :class:`.Query` object's use case.
+
+ .. versionchanged:: 0.8
+ Compatibility methods with ``collections.namedtuple()`` have been
+ added including :attr:`.KeyedTuple._fields` and
+ :meth:`.KeyedTuple._asdict`.
+
+ .. seealso::
+
+ :ref:`ormtutorial_querying`
"""
@@ -40,13 +61,40 @@ class KeyedTuple(tuple):
return t
def keys(self):
+ """Return a list of string key names for this :class:`.KeyedTuple`.
+
+ .. seealso::
+
+ :attr:`.KeyedTuple._fields`
+
+ """
+
return [l for l in self._labels if l is not None]
@property
def _fields(self):
+ """Return a tuple of string key names for this :class:`.KeyedTuple`.
+
+ This method provides compatibility with ``collections.namedtuple()``.
+
+ .. versionadded:: 0.8
+
+ .. seealso::
+
+ :meth:`.KeyedTuple.keys`
+
+ """
return tuple(self.keys())
def _asdict(self):
+ """Return the contents of this :class:`.KeyedTuple` as a dictionary.
+
+ This method provides compatibility with ``collections.namedtuple()``,
+ with the exception that the dictionary returned is **not** ordered.
+
+ .. versionadded:: 0.8
+
+ """
return dict((key, self.__dict__[key]) for key in self.keys())