Correct type for a simple "bag of attributes" namespace object

Albert-Jan Roskam fomcl at yahoo.com
Sun Aug 3 05:17:44 EDT 2014


--- Original Message -----
> From: Terry Reedy <tjreedy at udel.edu>
> To: python-list at python.org
> Cc: 
> Sent: Sunday, August 3, 2014 4:43 AM
> Subject: Re: Correct type for a simple "bag of attributes" namespace object
> 
> On 8/2/2014 8:59 PM, Ian Kelly wrote:
>>  On Sat, Aug 2, 2014 at 2:46 PM, Mark Summerfield 
> <list at qtrac.plus.com> wrote:
>>>  On Saturday, 2 August 2014 20:58:59 UTC+1, Ben Finney  wrote:
>>>>  Steven D'Aprano writes:
>>>> 
>>>>>  If you need instances which carry state, then object is the 
> wrong
>>>>>  class.
>>> 
>>>  Fair enough.
>>> 
>>>>  Right. The 'types' module provides a SimpleNamespace class 
> for the
>>>>  common "bag of attributes" use case::
>>>> 
>>>>       >>> import types
>>>>       >>> foo = types.SimpleNamespace()
>>>>       >>> foo.x = 3
>>>>       >>> foo
>>>>       namespace(x=3)
>>> 
>>>  This is too much for children (& beginners).
>>> 
>>>  But perhaps what I should be asking for is for a new built-in that does 
> what types.SimpleNamespace() does, so that without any import you can write, 
> say,
>>> 
>>>  foo = namespace(a=1, b=2)
>>>  # or
>>>  bar = namespace()
>>>  bar.a = 1

I find the following obscure (to me at least) use of type() useful exactly for this "bag of attributes" use case:
>>> employee = type("Employee", (object,), {})
>>> employee.name = "John Doe"
>>> employee.position = "Python programmer"
>>> employee.name, employee.position, employee
('John Doe', 'Python programmer', <class '__main__.Employee'>)

>>> details = dict(name="John Doe", position="Python programmer")
>>> employee = type("Employee", (object,), details)
>>> employee.name, employee.position, employee
('John Doe', 'Python programmer', <class '__main__.Employee'>)


regards,
Albert-Jan 




More information about the Python-list mailing list