[Grok-dev] changing martian to support class decorators
Martin Aspeli
optilude+lists at gmail.com
Mon Mar 21 16:26:20 EDT 2011
Hi,
On 21 March 2011 17:58, Martijn Faassen <faassen at startifact.com> wrote:
> Hi there,
>
> Prompted by discussions on zope-dev and a conversation with Souheil I
> looked a bit at Martian to see what would be required to support class
> decorators.
>
> There are two alternatives I can see concerning syntax. One is to turn
> the directives into decorators:
>
> @grok.context(Foo)
> @grok.name('bar')
> class MyClass(...):
> ...
+1
> the other is to use a single decorator to kick things off:
>
> @grok.config(
> grok.context(Foo),
> grok.name('bar'),
> )
> class MyClass(...):
> ...
-1
It's not clear what benefit you get from the extra @grok.config as an
integrator/end user: it's just more typing for the same thing.
> We have another issue if we care about Python 3 support: module-level
> directives. These use the same frame hack, but I expect this will fail
> to work for the same reasons. Can we come up with a way to spell module
> level directives differently? Perhaps like this?
>
> module_config = grok.module_config(
> grok.context(Foo),
> )
+0 - what's the module_config variable for?
> or maybe this:
>
> @grok.context(Foo)
> class ModuleConfig(object):
> pass
-1 -- I really don't like the idea of classes used just for
configuration with no body or Python implementation logic. It feels
like language abuse. For the same reason, I prefer ZCML for defining
permissions and resource directories instead of "faux" classes like
grok.Permission and grok.ResourceDirectory.
It may be worth looking at the pattern that Google Guice uses:
basically the template method pattern. It may look like:
class ModuleConfig(grok.Config):
def configure(self):
this.setDefaultContext(IFoo)
...
> Another approach, which I'd like to avoid if at all possible, would be a
> code conversion tool.
Yes, please - I don't think that's workable.
> Yet another approach would be to expose *two* sets of directives per
> grokcore package, one old-style, the other new-style. But
> 'grok.context()' reads so nicely I don't want to give it up...
I think people would get very confused by this and we'd end up with mismatches.
Martin
More information about the Grok-dev
mailing list