[Zope-dev] Constant values defined in interfaces

Martin Aspeli optilude+lists at gmail.com
Sun Apr 5 00:01:53 EDT 2009


Chris Rossi wrote:

> 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.")
> 
> Using descriptors, the results could be both static and immutable.
> 
> Does this seem useful to anyone besides me?  Anyone who's done much Java 
> programming will recognize that I did not have an original idea here. 

-1

I think having a more robust way to spell and namespace constants may be 
interesting, but what we see above, with a mixed interface/class, is 
actually not going to work given zope.interface's semantics. You'd end 
up with an interface that promised an attribute that didn't exist.

In Java, you can do:

  interface IFoo {
      public static String FOO = "foo";
  }

  class Foo implements IFoo {}

  f = Foo();

  System.out.println(f.FOO);

In Python with zope.interface, implements() doesn't mean you inherit 
attributes. Therefore, you'd need to do:

  class IFoo(Interface):
      FOO = Constant("foo")

  class Foo(object):
      implements(IFoo)
      FOO = "foo" # or FOO = IFoo['FOO'].get() or something

  f = Foo()
  print f.FOO

Without repeating the definition of the FOO constant in each class 
implementing IFoo, the interface would be promising an attribute that 
didn't exist. validateInterface() would complain too.

In general, I don't have a problem with doing constants that are not, 
strictly speaking, immutable. I tend to put them in interfaces.py if 
they are part of the "contract" of my package. Codifying that as good 
practice is probably a good idea. We certainly could come up with some 
other way of spelling this, e.g.

  class FooConstants(Constants):
      FOO = Contant("Foo")

or whatever... maybe some way to mix in zope.schema to to describe the 
fields in more details. But it feels like a fair amount of situps when 
you can just do FOO = "Foo" at module level and be done with it. Python 
is a dynamic language. We don't have privates or final methods or lots 
of other things that you can spell in a strictly typed, compiled 
language like Java.

Martin

-- 
Author of `Professional Plone Development`, a book for developers who
want to work with Plone. See http://martinaspeli.net/plone-book



More information about the Zope-Dev mailing list