[Twisted-web] Re: [Nevow-commits] r962 - One billion times better Choice...

Donovan Preston dp at ulaluma.com
Tue Dec 21 10:17:17 MST 2004

On Dec 21, 2004, at 7:30 AM, Alex Levy wrote:

> What I do (fairly regularly) with my application involves declaring the
> available choices as part of the _implementing_ class, not as part of 
> the
> interface. I typically used choicesAttribute to do this, and was 
> working on
> something along the lines of a choicesMethod, but now it seems that 
> this
> behavior has been deprecated.

Of course. The interface should never contain implementation code, but 
in this case the change just made using Choice so much more uniform and 
simple that it was obviously correct.

> So, what is the new recommended syntax for a Choice where the 
> implementing
> class can change the choices dynamically?

It really depends where you want to look up the method. If it's truly 
the *implementor* that you want, you can do exactly what the 
choicesAttribute backwards-compatibility code does:

Choices(lambda ctx, data: 
getattr(iformless.IConfigurable(ctx).original, 'someAttribute'))

Of course, you probably want to make using this a little nicer:

def choiceMethod(name):
     return lambda ctx, data: 
getattr(iformless.IConfigurable(ctx).original, name)

Also, perhaps you want to look for an already existing data method on 
your Page instead, to make your code more uniform:

def dataMethod(name):
     return lambda ctx, data: inevow.IContainer(ctx).child(ctx, name)

The point is instead of writing special cases in the actual Choice 
code, the programmer can plug in exactly what their case is. Oh, and it 
supports deferreds, too ;-)


More information about the Twisted-web mailing list