[Python-ideas] a simple namespace type

Eric Snow ericsnowcurrently at gmail.com
Thu May 24 21:34:07 CEST 2012


On Thu, May 24, 2012 at 12:14 PM, Guido van Rossum <guido at python.org> wrote:
> On Thu, May 24, 2012 at 10:17 AM, Eric Snow <ericsnowcurrently at gmail.com> wrote:
>>  Effectively this is just a simple but distinct facade around dict to
>> give a namespace with attribute access.  I suppose part of the
>> question is how much of the Mapping interface would belong instead to
>> a hypothetical Namespace interface. (I'm definitely _not_ proposing
>> such an unnecessary extra level of abstraction).
>
> Possibly there is a (weird?) parallel with namedtuple. The end result
> is somewhat similar: you get to use attribute names instead of the
> accessor syntax (x[y]) of the underlying type. But the "feel" of the
> type is different, and inherits more of the underlying type
> (namedtuple is immutable and has a fixed set of keys, whereas the type
> proposed here is mutable and allows arbitrary keys as long as they
> look like Python names).

Yeah, the feel is definitely different.  I've been thinking about this
because of the code for sys.implementation.  Using a structseq would
probably been the simplest approach there, but a named tuple doesn't
feel right.  In contrast, a SimpleNamespace would fit much better.

As far as this goes generally, the pattern of a simple, dynamic
attribute-based namespace has been implemented a zillion times (and
it's easy to do).  This is because people find a simple dynamic
namespace really handy and they want the attribute-access interface
rather than a mapping.

In contrast, a namedtuple is, as Nick said, "the standard library's
answer for structured records".  It's an immutable (attribute-based)
namespace implementing the Sequence interface.  It's a tuple and
directly reflects the underlying concept of tuples in Python by giving
the values names.

SimpleNamespace (and the like) isn't a structured record.  It's only
job is to be an attribute-based namespace with as simple an interface
as possible.

So why isn't a type like SimpleNamespace in the stdlib? Because it's
trivial to implement.  There's a certain trivial-ness threshold a
function/type must pass before it gets canonized, and rightly so.

Anyway, while many would use something like SimpleNamespace out the
the standard library, my impetus was having it as a builtin type so I
could use it for sys.implementation.  :)

FWIW, I have an implementation (pure Python + c extension) of
SimpleNamespace on PyPI:

  http://pypi.python.org/pypi/simple_namespace

-eric



More information about the Python-ideas mailing list