Jp Calderone wrote: > David Eppstein wrote: > >> In article <un011l2qz.fsf at boost-consulting.com>, >> David Abrahams <dave at boost-consulting.com> wrote: >> >> >>>> class Foo: >>>> >>>> decorate static: >>>> >>>> def static1(blah...): >>>> pass >>>> >>>> decorate locksFile: >>>> >>>> def static2andLocks(blah...): # both decorators appy >>>> pass >>> >>> >>> Wow, Martin Z's idea (using your keyword) really went "thunk" for me. >>> What decorate does would be very much like what "class" does in some >>> ways. >> >> >> >> class: (and other something: constructs) start a block that can >> contain any code. Does this decorate keyword allow e.g. assignments >> as well as defs and other decorates? Or loops? If so what should it >> mean? Is it like that locals() gets replaced by a special >> dictionary-like-object that calls the decorator whenever any of its >> contents gets set? >> > > (I have no idea what the original poster intended, however....) > > 'decorate' expression ':' > suite > > could create a nested scope, the locals of which could be passed to > whatever "expression" evaluates to (or if it is a tuple, do the looping > thing, since people seem to like that). > > The call can return a dict with which the class dict is updated. FWIW, I proposed something very similar to this on python-list (http://mail.python.org/pipermail/python-list/2004-August/233262.html). It didn't get a very excited reception there. I think deafening silence is the phrase I'd use. But perhaps it'll inspire some new thoughts on your proposal. The gist of my proposal was that: 'def' name 'as' expression ':' suite would bind name to the result of expression where expression was evaluated in the scope of suite, after suite was executed. So, to reuse the example below: class Foo(object): def bar as staticmethod(bar): def bar(x): print 'spam', x For several more examples, see the original post. -tim > > For that matter, 'decorate' could even be dropped, to avoid > introducing a new keyword. I don't think > > expression ':' > suite > > means anything in the current grammar. This would mean staticmethod > and classmethod would no longer work (unless we really want them to - > they can do type checking on their argument and modify their behavior > accordingly). Replacement implementations would be simple. In fact, > making any current decorator work with this new mechanism is easy: > > def forall(decorator): > def new_decorator(namespace): > for k, v in namespace.items(): > namespace[k] = decorator(v) > return namespace > return new_decorator > > class Foo(object): > forall(staticmethod): > def bar(x): > print 'spam', x > > Many decorators would probably be used with something like forall, or > simply support dicts directly. Of course, many would want to work some > other way. > > For the PyObjC crowd, I think this would remove a major use of > metaclasses (as people have argued that metaclasses are hard to > understand and best avoided for simple decoration, this seems to be a > good thing). I can also think of some terrible, terrible metaclass > hackery in my own code that this would obviate the need for. > > This covers a use case James Knight mentioned as well. As he pointed > out, '@' and other proposals only decorate functions (and maybe classes, > soon). The example he gave, I believe, was: > > @public > x = 1 > > This doesn't work, but: > > public: > x = 1 > > would. Now, swallow that scream of horror (I did, barely ;). "public" > here is intended to be defined as something like: > > def public(namespace): > __all__.extend(namespace.keys()) > return namespace > > I can see the potential for confusion to new Python programmers here, > though, if they come from certain other languages. Perhaps leaving the > keyword prefix would be best after all. > > Another possibility would be to pass a code object for the suite, > instead of a namespace. I am inclined to prefer this, since it more > closely resembles the other construct which can create a nested scope. > It adds the burden of exec'ing the code to the decorator, though. This > isn't a problem if something like "forall" above is included in the > stdlib, since the common case is dealt with already (thus people > desiring class or static methods need not know or care about it), and > more advanced users will value the power it affords over the minor > additional effort required to use it. > > Jp > _______________________________________________ > Python-Dev mailing list > Python-Dev at python.org > http://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: > http://mail.python.org/mailman/options/python-dev/python-python-dev%40m.gmane.org > >
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4