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
>[EMAIL PROTECTED]
>541-302-1107
>________________________
>We who cut mere stones must always be envisioning cathedrals.
>-Quarry worker's creed
>
>
>_______________________________________________
>Tutor maillist - [email protected]
>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.
_______________________________________________
Tutor maillist - [email protected]
http://mail.python.org/mailman/listinfo/tutor