should "self" be changed?

Marko Rauhamaa marko at pacujo.net
Thu May 28 12:59:23 EDT 2015


Ian Kelly <ian.g.kelly at gmail.com>:

> On Thu, May 28, 2015 at 9:01 AM, Marko Rauhamaa <marko at pacujo.net> wrote:
>> Anssi Saari <as at sci.fi>:
>>
>>> Do you have an example of state pattern using nested classes and
>>> python? With a quick look I didn't happen to find one in any
>>> language.
>>
>> Here's an sampling from my mail server:
>
> I think I would be more inclined to use enums. This has the advantages
> of not creating a new set of state classes for every connection
> instance and that each state is a singleton instance, allowing things
> like "if self.state is SMTPConnectionState.IDLE". It could look
> something like this:
>
> class SMTPConnectionState(Enum):
>
>     class IDLE:
>         @classmethod
>         def handle_command(cls, conn, cmd):
>             # ...
>
>     class SPF_HELO:
>         @classmethod
>         def terminate(cls, conn):
>             # ...

Really, the main expressive choice is whether you use an inner class
(and get the advantages of a closure) or an outer class (and get
potential performance advantages).

When I have coded state machines for C or Java, I have noticed that
nothing beats enums and switch statements performance-wise, and
expressively, they're not that bad, either. Python doesn't have a switch
statement, so the natural thing is to ride on method dispatching
(whether via inner or outer classes). However, I must say the exception
"idiom" someone mentioned on this forum way back has its lure:

    try: raise self.state
    except IDLE:
        #...
    except SPF_HELO:
        #...


Marko



More information about the Python-list mailing list