ADT for restricted set of values

Ben Finney bignose+hates-spam at benfinney.id.au
Thu Nov 3 19:56:05 EST 2005


Howdy all,

I'd like to have an Abstract Data Type for a scalar value that is
restricted to a small set of values. Like an Enum, I suppose.

What I would like is to be able to use simple 'str' values in most of
the code, but where the values are actually used in a semantically
meaningful context, have them used as an ADT that will barf if the
value isn't part of the set.

Using the HumanSex class example from an earlier thread:

    class HumanSex(str):

        _descriptions = {
            None:       "unknown",
            'male':     "Male",
            'female':   "Female",
        }

        def __init__(self, value):
            str.__init__(value)
            if value not in self._descriptions:
                raise ValueError, \
                    "Not a valid HumanSex value: '%s'" % value

        def __get_description(self):
            return self._descriptions[self]
        description = property(__get_description)

This way, most of the rest of the code doesn't need to know that the
HumanSex instances are anything but a simple 'str' value.

Is this a sensible way to do what I'm describing? Am I missing a
common programming pattern?

-- 
 \      "I bought a self learning record to learn Spanish. I turned it |
  `\        on and went to sleep; the record got stuck. The next day I |
_o__)                could only stutter in Spanish."  -- Steven Wright |
Ben Finney



More information about the Python-list mailing list