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