[Python-ideas] a simple namespace type

Yuval Greenfield ubershmekel at gmail.com
Thu May 24 13:59:15 CEST 2012


On Tue, May 22, 2012 at 7:26 PM, Eric Snow <ericsnowcurrently at gmail.com>wrote:

> Below I've included a pure Python implementation of a type that I wish
> was a builtin.  I know others have considered similar classes in the
> past without any resulting change to Python, but I'd like to consider
> it afresh[1][2].
>
>  class SimpleNamespace:
>      """A simple attribute-based namespace."""
>      def __init__(self, **kwargs):
>          self.__dict__.update(kwargs)  # or self.__dict__ = kwargs
>      def __repr__(self):
>          keys = sorted(k for k in self.__dict__ if not k.startswith('_'))
>          content = ("{}={!r}".format(k, self.__dict__[k]) for k, v in keys)
>          return "{}({})".format(type(self).__name__, ", ".join(content))
>
> This is the sort of class that people implement all the time.  There's
> even a similar one in the argparse module, which inspired the second
> class below[3].  If the builtin object type were dict-based rather
> than slot based then this sort of namespace type would be mostly
> superfluous.  However, I also understand how that would add an
> unnecessary resource burden on _all_ objects.  So why not a new type?
>
> Nick Coghlan had this objection recently to a similar proposal[4]:
>
>    Please, no. No new
>    just-like-a-namedtuple-except-you-can't-iterate-over-it type, and
>    definitely not one exposed in the collections module.
>
>    We've been over this before: collections.namedtuple *is* the standard
>    library's answer for structured records. TOOWTDI, and the way we have
>    already chosen includes iterability as one of its expected properties.
> [...]


I've implemented this a few times as well. I called it "AttributeDict" or
"Record".


I think adding an __iter__ method would be beneficial. E.g.

class  SimpleNamespace :
     def __init__(self, **kwargs):
         self.__dict__.update(kwargs)  # or self.__dict__ = kwargs
         self.__iter__ = lambda: iter(kwargs.keys())


Why do we need this imo:

* sometimes x.something feels better than x['something']
* to ease duck-typing, making mocks, etc.
* Named tuple feels clunky for certain dynamic cases (why do I need to
create the type for a one-off?)


I wonder if SimpleNameSpace should allow __getitem__ as well...


Yuval
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20120524/76924661/attachment.html>


More information about the Python-ideas mailing list