[Tutor] Data Type with Dictionary and List Behavior

Orri Ganel singingxduck at gmail.com
Tue Mar 28 23:24:04 CEST 2006


Carroll, Barry wrote:

>Greetings:
>
>I have a function that computes the checksum of an integer, including or excluding digits in the computation based on the content of a mask string.  For example, 
>
>    cksum(123456789, '***...***')
>
>will do its computation on 123789, masking out the three non-significant digits.  
>
>My question concerns assigning the value of the mask string.  The class that defines the function also pre-defines several masks, say '*********', '***...***', and '......***'.  The masks have names: 'all', 'first-last', 'last'. Of these, 'all' is the most commonly used.  The user may select one of these masks, or may supply their own, arbitrary value. Further, the user can choose to add their value to the group of pre-defines, and reuse that value later in the session.  (The user-defined mask is not saved between sessions; no permanent storage is required.)
>
>So far, this structure looks like a dictionary.  However, the user also wants to access the group of pre-defined masks as if they were elements of a list: 
>
>     masks[0] returns '*********' 
>     masks[1] returns '***...***'
>
>and so on.  To make matters even more complex, if the user does not specify a mask to use, the function should use the mask employed in the previous invocation, defaulting to masks[0] if this is the first invocation.  Finally, the user can set a mask as 'default', which essentially marks a mask as 'last used' without invoking the function.  
>
>Is there a derived type or data structure in existence that implements these capabilities (in descending order of importance?
>
>    1. Access by name         (dict)
>    2. Access by position     (list)
>    3. Addition of new items  (dict, list)
>    4. Set a 'last used' item (??????)
>    5. Set a 'default' item   (dict???)
>
>Thanks in advance for your help.  
>
>Regards,
> 
>Barry
>barry.carroll at psc.com
>541-302-1107
>________________________
>We who cut mere stones must always be envisioning cathedrals.
>-Quarry worker's creed
>
>
>_______________________________________________
>Tutor maillist  -  Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor
>
>  
>
Would the following fit the bill?

 >>> class maskdict(dict):
    def __init__(self, seq={}):
        
dict.__init__(self,{True:["*********","***...***","......***"],False:{"all":"*********","first-last":"***...***","last":"......***",None:"**********"}})
        self.update(seq)
    def __getitem__(self, index=None):
        dict.__getitem__(self, isinstance(index,int))[index]
        self[None] = dict.__getitem__(self,isinstance(index,int))[index]
        return dict.__getitem__(self, False)[None]
    def __setitem__(self, index, value):
        if isinstance(index, int):
            return dict.__setitem__(self, isinstance(index,int), 
dict.__getitem__(self,isinstance(index,int))+[value])
        return dict.__setitem__(dict.__getitem__(self, False), index, value)
    def setdef(self, default):
        self[None] = default

 >>> md = maskdict()
 >>> md[0]
'*********'
 >>> md["all"]
'*********'
 >>> md[1]
'***...***'
 >>> md["first-last"]
'***...***'
 >>> md[2]
'......***'
 >>> md["last"]
'......***'
 >>> md.__getitem__()  # md[] results in a syntax error instead of 
passing None on to __getitem__ like you'd expect
'......***'
 >>> md[1]
'***...***'
 >>> md.__getitem__()
'***...***'
 >>> md[0]
'*********'
 >>> md.__getitem__()
'*********'
 >>> md[3] = "****....."
 >>> md[3]
'****.....'
 >>> md["first-four"] = md[3]
 >>> md["first-four"]
'****.....'
 >>> md.setdef(md[3])
 >>> md.__getitem__()
'****.....'

You'd still have to figure out how to integrate it in to your checksum 
function as well as make meaningful error messages, but it should give 
you a good start.

Cheers,
Orri

-- 
Email: singingxduck AT gmail DOT com
AIM: singingxduck
Programming Python for the fun of it.



More information about the Tutor mailing list