What do you use as symbols for Python ?

bruno at modulix onurb at xiludom.gro
Thu Nov 10 14:14:19 CET 2005

Pierre Barbier de Reuille wrote:
> When you need some symbols in your program, what do you use in Python ?
> For example, an object get a state. This state is more readable if
> expressed as a symbols, for example "opened", "closed", "error".
> Typically, in C or C++, I would use an enum for that:
> {
>   opened, closed, error
> }
> In CAML or Haskell I would use the union types:
> type ObjectState = Opened | Closed | Error
> In Ruby I would use the symbols :
> object.state = :opened
> object.state = :closed
> object.state = :error
> ... but I don't know what to use in Python !

Depends on the job... If I need to do bitmask operations, I'll use
integer flags. If I want the symbol to be human-readable, I'll use
strings. But everything in Python being an object, you can use whatever
seems appropriate....

Since we're in a 'state' exemple, here's a possible state pattern

class MyObject(object):
    def __init__(self, name):
        self.name = name
        self.__class__ = ClosedState

    state = property(fget=lambda self: self.__class__)

    def open(self, arg):
        if arg == 1:
            self.__class__ = OpenedState
            self.__class__ = ErrorState

    def close(self):
        self.__class__ = ClosedState

class OpenedState(MyObject):pass
class ClosedState(MyObject):pass
class ErrorState(MyObject):pass

m = MyObject('toto')
assert m.state is ClosedState
assert m.state is OpenedState
assert m.state is ClosedState
assert m.state is ErrorState

I made states 'dummy' objects, but you could make this a real state
pattern implementation by defining default methods in the base class and
overriding appropriate methods in the 'state' subclasses.

bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"

More information about the Python-list mailing list