174: Fleshed out docstrings for SetProxy, DictProxy, and MagicDict

This commit is contained in:
Jason Gerard DeRose 2008-08-15 03:24:37 +00:00
parent 3e3b596f68
commit ec0596b429
2 changed files with 50 additions and 11 deletions

View File

@ -24,7 +24,7 @@ To learn about the ``ipalib`` library, you should read the code in this order:
1. Learn about the plugin framework in `ipalib.plugable` 1. Learn about the plugin framework in `ipalib.plugable`
2. Learn about the public api in `ipalib.public` 2. Learn about the public API in `ipalib.public`
3. Look at some example plugins in `ipalib.plugins.example` 3. Look at some example plugins in `ipalib.plugins.example`

View File

@ -124,13 +124,17 @@ def lock(readonly):
class SetProxy(ReadOnly): class SetProxy(ReadOnly):
""" """
A read-only proxy to an underlying set. A read-only container with set/sequence behaviour.
Although the underlying set cannot be changed through the SetProxy, This container acts as a proxy to an actual set-like object (a set,
the set can change and is expected to (unless the underlying set is a frozenset, or dict) that is passed to the constructor. To the extent
frozen set). possible in Python, this underlying set-like object cannot be modified
through the SetProxy... which just means you wont do it accidentally.
""" """
def __init__(self, s): def __init__(self, s):
"""
:param s: The target set-like object (a set, frozenset, or dict)
"""
allowed = (set, frozenset, dict) allowed = (set, frozenset, dict)
if type(s) not in allowed: if type(s) not in allowed:
raise TypeError('%r not in %r' % (type(s), allowed)) raise TypeError('%r not in %r' % (type(s), allowed))
@ -138,21 +142,43 @@ class SetProxy(ReadOnly):
lock(self) lock(self)
def __len__(self): def __len__(self):
"""
Returns the number of items in this container.
"""
return len(self.__s) return len(self.__s)
def __iter__(self): def __iter__(self):
"""
Iterates (in ascending order) through the items (or keys) in this
container.
"""
for key in sorted(self.__s): for key in sorted(self.__s):
yield key yield key
def __contains__(self, key): def __contains__(self, key):
"""
Returns True if this container contains ``key``, False otherwise.
:param key: The item (or key) to test for membership.
"""
return key in self.__s return key in self.__s
class DictProxy(SetProxy): class DictProxy(SetProxy):
""" """
A read-only proxy to an underlying dict. A read-only container with mapping behaviour.
This container acts as a proxy to an actual mapping object (a dict) that
is passed to the constructor. To the extent possible in Python, this
underlying mapping object cannot be modified through the DictProxy...
which just means you wont do it accidentally.
Also see `SetProxy`.
""" """
def __init__(self, d): def __init__(self, d):
"""
:param d: The target mapping object (a dict)
"""
if type(d) is not dict: if type(d) is not dict:
raise TypeError('%r is not %r' % (type(d), dict)) raise TypeError('%r is not %r' % (type(d), dict))
self.__d = d self.__d = d
@ -161,28 +187,41 @@ class DictProxy(SetProxy):
def __getitem__(self, key): def __getitem__(self, key):
""" """
Returns the value corresponding to ``key``. Returns the value corresponding to ``key``.
:param key: The key of the value you wish to retrieve.
""" """
return self.__d[key] return self.__d[key]
class MagicDict(DictProxy): class MagicDict(DictProxy):
""" """
A read-only dict whose items can also be accessed as attributes. A read-only mapping container whose values can also be accessed as
attributes.
Although a MagicDict is read-only, the underlying dict can change (and is For example, assuming ``magic`` is a MagicDict instance that contains the
assumed to). key ``name``, you could do this:
One of these is created for each allowed base in a `Registrar` instance. >>> magic[name] is getattr(magic, name)
True
This container acts as a proxy to an actual mapping object (a dict) that
is passed to the constructor. To the extent possible in Python, this
underlying mapping object cannot be modified through the MagicDict...
which just means you wont do it accidentally.
Also see `DictProxy` and `SetProxy`.
""" """
def __getattr__(self, name): def __getattr__(self, name):
""" """
Returns the value corresponding to ``name``. Returns the value corresponding to ``name``.
:param name: The name of the attribute you wish to retrieve.
""" """
try: try:
return self[name] return self[name]
except KeyError: except KeyError:
raise AttributeError('no attribute %r' % name) raise AttributeError('no magic attribute %r' % name)
class Plugin(ReadOnly): class Plugin(ReadOnly):