[Python-ideas] a simple namespace type
Guido van Rossum
guido at python.org
Thu May 24 20:14:28 CEST 2012
On Thu, May 24, 2012 at 10:17 AM, Eric Snow <ericsnowcurrently at gmail.com> wrote:
> On Thu, May 24, 2012 at 5:59 AM, Yuval Greenfield <ubershmekel at gmail.com> wrote:
>> 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].
>>> [...]
>>
>> I've implemented this a few times as well. I called it "AttributeDict" or
>> "Record".
I tend to call it "Struct(ure)" -- I guess I like C better than Pascal. :-)
>> 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())
>
> I'd like to limit the syntactic overlap with dict as much as possible.
+1
> 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).
> Regardless, if you want to do dict things then you can get the
> underlying dict using vars(ns) or ns.__dict__ on your instance.
> Alternately you can subclass the SimpleNamespace type to get all the
> extra goodies you want, as I showed with the Namespace class at the
> bottom of my first message.
>
>> 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?)
>
> Yup.
>
>> I wonder if SimpleNameSpace should allow __getitem__ as well...
>
> Same thing: just use vars(ns) or a subclass of SimpleNamespace.
--
--Guido van Rossum (python.org/~guido)
More information about the Python-ideas
mailing list