mutable ints: I think I have painted myself into a corner
Peter Otten
__peter__ at web.de
Sun May 19 03:01:49 EDT 2013
Cameron Simpson wrote:
> TL;DR: I think I want to modify an int value "in place".
>
> Yesterday I was thinking about various "flag set" objects I have
> floating around which are essentially bare "object"s whose attributes
> I access, for example:
>
> flags = object()
> flags.this = True
> flags.that = False
>
> and then elsewhere:
>
> if flags.that:
> do that ...
>
> Nice and readable, but I thought to myself: so bulky!
Plus, it doesn't work:
>>> object().this = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'this'
> The use case for flags is essentially boolean/binary, and so a int
> accessed as a bitmask should be smaller.
>
> So I pulled out my BitMask int subclass (which mostly transcribes
> the int as "A|B|C" for readability purposes, partly to dillute Nick
> Coglan's liking for bulky strings over compact ints on readability
> grounds:-), and gave the subclass attribute access.
>
> This works just fine for querying the flags object, with code exactly
> like the "if" statement above.
>
> But setting up a flags object? What I _want_ to write is code like this:
>
> Flags = BitMask('this', 'that')
>
> # set default state
> flags = Flags()
> flags.this = False
> flags.that = True
> ... iterate over some options ...: flags.this = True
>
> and there's my problem. This would modify the int in place. There's
> no way to do that. For the base type (int) this makes perfect sense,
> as they're immutable.
>
> Before I toss this approach and retreat to my former "object"
> technique, does anyone see a way forward to modify an int subclass
> instance in place? (That doesn't break math, preferably; I don't
> do arithmetic with these things but they are, after all, ints...)
No, but you could make
flags = Flags(this=False, that=True)
work.
More information about the Python-list
mailing list