Steven D'Aprano wrote:
(3) Then somone suggested to tie the constants to the function itself,
as in
def move(direction):
    print "moving %s" % direction

move.UP = 'up'
move.DOWN = 'down'

This is quite nice.

I would call it a horrible, horrible, horrible code smell. A stench in fact. In my opinion, such attributes tied to the function should be treated as internal to the function, and not the public interface.

I wouldn't go quite so far as to say they should be treated as private, but having the caller use them should be rare and unusual.

I don't think so, my solution is perfect :o)

Let me clarify, I wouldn't write this piece of code, but the OP seems to really worry about the 'noise' around its direction definitions. That is why I removed the constant class definition of DIRECTION, and add directly those constants in the function itself, allowing to use them without additional import statements. It is not usual but it is not *that* smelling.

def move(direction):
   """Move to the given direction.

   @param direction: one of the function constant move.UP or move.DOWN
   """
   print "moving %s" % direction
move.UP = 'up'
move.DOWN = 'down'


As soon as it is properly documented, as a public interface should be, it becomes an acceptable design, IMO. Not the design I would choose in normal circonstances though.

Jean-Michel

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to