On Jan 10, 2018 18:57, Steven D'Aprano <st...@pearwood.info> wrote: > > On Wed, Jan 10, 2018 at 04:08:04PM +0000, Albert-Jan Roskam wrote: > > > In another thread on this list I was reminded of > > types.SimpleNamespace. This is nice, but I wanted to create a bag > > class with constants that are read-only. > > If you expect to specify the names of the constants ahead of time, the > best solution is (I think) a namedtuple.
Aaah *slaps forehead*, for some reason I didn't think about this, though I use namedtuples quite often. Using a metaclass for the very first time was great fun though :-) > from collections import namedtuple > Bag = namedtuple('Bag', 'yes no dunno') > a = Bag(yes=1, no=0, dunno=42) > b = Bag(yes='okay', no='no way', dunno='not a clue') > > ought to do what you want. > > Don't make the mistake of doing this: > > from collections import namedtuple > a = namedtuple('Bag', 'yes no dunno')(yes=1, no=0, dunno=42) > b = namedtuple('Bag', 'yes no dunno')(yes='okay', no='no way', dunno='not a > clue') But if I do: Bag = namedtuple('Bag', 'yes no dunno') ... and then I create hundreds of Bag instances, this doesn't have a large memory footprint, right? (Because of __slots__) Or is a regular tuple still (much) less wasteful? > because that's quite wasteful of memory: each of a and b belong to a > separate hidden class, and classes are rather largish objects. > > > If you expect to be able to add new items on the fly, but have them > read-only once set, that's a different story. > > > -- > Steve > _______________________________________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > https://mail.python.org/mailman/listinfo/tutor _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor