Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #105544

Re:

From Erik <python@lucidity.plus.com>
Newsgroups comp.lang.python
Subject Re:
Date 2016-03-23 11:56 +0000
Message-ID <mailman.51.1458734377.2244.python-list@python.org> (permalink)
References <CAFWQgO=o-rPavakLZZBRxAthM5g7xE=Mn4hwcFPxTUvCEXn7SQ@mail.gmail.com>

Show all headers | View raw


Hi Nick,

On 23/03/16 03:17, Nick Eubank wrote:
> In other words:
>
>   In[1]:
>       d = {True: 'a', False: 'b'}
>       d[0] = 'z'
>       d[False]
>
> Out[1]:
>       'z'
[snip]
> Relatedly, if this is a desired behavior, any advice one how best to work
> with dictionaries when one wants "True" and 1 to be different?

See the accepted answer here:

http://stackoverflow.com/questions/3387691/python-how-to-perfectly-override-a-dict

If you use the class that the answer suggests and then define a subclass:

"""
class MyTransformedDict(TransformedDict):
     __reverse_transform__ = {
             "__True__": True,
             "__False__": False,
         }

     def __keytransform__(self, key):
         if key is True: return "__True__"
         if key is False: return "__False__"
         return key

     def __iter__(self):
         return (self.__reverse_transform__.get(k, k)
             for k in super(MyTransformedDict, self).__iter__())

     def __contains__(self, key):
         return self.__keytransform__(key) in self.store

"""

Then as long as you wrap such dictionaries in a "MyTransformedDict()" 
(choose a better name!), it will do what:

"""
d = MyTransformedDict({True: 'a', False: 'b'})
d[0] = 'z'
d[False]
"""

Note that in your case, I've added the reverse transformation from the 
magic tokens so that iter(), .iterkeys() and .iteritems()) return the 
original True and False keys.

I've also added __contains__, but that should be in the 
"TransformedDict()" superclass (I didn't want to reproduce the whole of 
that here).

There are things missing (such as a dict-like repr()) or not done 
optimally there, but it might be a good start. This works on Python 2 and 3.

E.

Back to comp.lang.python | Previous | Next | Find similar | Unroll thread


Thread

Re: Erik <python@lucidity.plus.com> - 2016-03-23 11:56 +0000

csiph-web