No muchos conocen esta característica, pero las funciones (y métodos) de Python pueden tener atributos . Mirad:
>>> def foo(x):
... pass
...
>>> foo.score = 10
>>> dir(foo)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name', 'score']
>>> foo.score
10
>>> foo.score += 1
>>> foo.score
11
¿Cuáles son los posibles usos y abusos de esta función en Python? Un buen uso que conozco es el uso que hace PLY de la cadena de documentación para asociar una regla de sintaxis con un método. ¿Pero qué pasa con los atributos personalizados? ¿Hay buenas razones para usarlos?