[Zope-dev] Constant values defined in interfaces

Gary Poster gary.poster at gmail.com
Fri Apr 3 13:55:03 EDT 2009


On Apr 3, 2009, at 12:35 PM, Chris Rossi wrote:

> Hello,

Hi Chris.

>
> I was wondering if the Zope collective had given any consideration  
> to allowing constants to be defined in interfaces.  To be clear,  
> these are constant values that make up the protocol defined by the  
> interface.

...

FWIW, interfaces.py is often regarded as a contract itself.  A current  
best practice is to define constants and exceptions in that file, and  
import them from the module.

> If this hasn't been done yet, I can envision doing something like:
>
> from zope.interface import Constant
>
> class IHttpResponse(Interface):
>     """Models an HTTP 1.1 response.
>     """
>     HTTP_OK = Constant("200 Ok", "An HTTP Ok response.")
>     HTTP_NOT_FOUND = Constant("404 Not Found", "An HTTP Not Found  
> response")
>
>     status = Attribute("HTTP status code for this response.")

How would that be a win for you (or anybody else) over just putting  
the constant in the interfaces module?

If it is in the interface, that implies we need to "implement" it  
someplace--the constant will be defined in the interface and in the  
implementation?  Or we would offer automation to copy the values over  
from the interface to objects that implement the interface?

> Using descriptors, the results could be both static and immutable.

Mostly static and immutable, anyway. :-)  In Python, there's almost  
always a way around absolutes like that unless you are working with  
something in which the constraint has been coded in C.

I don't find enforcing a constant's immutability in any way other than  
relying on a programmer's good sense to be particularly valuable.  I  
have sympathy for "enterprise-y" concerns, in which you have some belt- 
and-suspenders--we use security proxies for that kind of thing, and  
appreciate them despite their added pain--but I don't see how a  
programmer might "forget" to not overwrite an ALL_CAPS constant.

And finally, this "Constant" constructor would control the interface,  
not the implementation, so you'd have to do the static/immutable  
things elsewhere.

So, I'm -1 on "Constant" unless someone gives a convincing reason why  
it is preferable to putting constants in the module, in which case I  
will suddenly have a polar shift to +0. :-)

Gary


More information about the Zope-Dev mailing list