I actually encountered this for the first time yesterday and didn't realise that the decorator syntax was limited in this way (I was mentally preparing a blog entry when these emails arrived).<br><br>What I needed to do was turn a Python function into a .NET event handler in IronPython. The simple case is this:<br>
<br>from System import EventHandler<br><br>@EventHandler<br>def on_event(sender, event):<br> # do stuff...<br><br>This works fine of course, but then I needed to use the 'typed' form which is like this:<br><br>
@EventHandler[HtmlEventArgs]<br>def on_event(sender, event):<br> # do stuff...<br><br>I didn't realise this was invalid syntax - nor the neat trick with the identity function to bypass the limitation.<br><br>Michael<br>
<br><div class="gmail_quote">2009/9/2 Carl Johnson <span dir="ltr"><<a href="mailto:cmjohnson.mailinglist@gmail.com">cmjohnson.mailinglist@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Crossposting to Python-ideas,<br>
<br>
I asked for the same change to the grammar a couple months back on<br>
python-ideas.<br>
<br>
See <a href="http://mail.python.org/pipermail/python-ideas/2009-February/thread.html#2787" target="_blank">http://mail.python.org/pipermail/python-ideas/2009-February/thread.html#2787</a><br>
<br>
I'm all for it, but you'll have to convince Guido that this won't<br>
result in confusing to read code. My own examples, unfortunately did<br>
not advance your cause, as Guido explained, "My brain hurts trying to<br>
understand all this. I don't think this bodes well as a use case for a<br>
proposed feature." :-D The trouble is that I was using lambdas upon<br>
lambdas to do all kinds of Ruby block-esque tricks. OTOH, if you come<br>
up with some simple, clear use cases though, and I think he might<br>
still be persuadable to make a simple change to the grammar.<br>
<br>
<br>
— Carl Johnson<br>
<div><div></div><div class="h5"><br>
Rob Cliffe <<a href="mailto:rob.cliffe@btinternet.com">rob.cliffe@btinternet.com</a>> wrote:<br>
<br>
> Hi All,<br>
> This is my first post to python-dev so I will briefly introduce myself: My<br>
> name is Rob Cliffe and I am a commercial programmer living in London, UK. I<br>
> have some 30 years of programming experience but have only been using Python<br>
> for a couple of years.<br>
> First I want to say what a fantastic language Python is. It is THE best<br>
> language for development in my opinion, and a joy to use.<br>
><br>
> My specific issue:<br>
> I eventually got my head round decorator syntax and realised that what came<br>
> after the '@' was (basically) a function that took a function as argument<br>
> and returned a function as result.<br>
> However it seems to me unPythonesque (i.e. an exception to Python's normal<br>
> consistency) that the syntax of what follows the '@' should be restricted to<br>
> either a single (function) identifier or a single (function) identifier with<br>
> an argument list.<br>
> The example I tried, which seems not an unreasonable sort of thing to do,<br>
> was along the lines of:<br>
><br>
> def deco1(func):<br>
> <deco1-suite><br>
> def deco2(func):<br>
> <deco2-suite><br>
><br>
> DecoList = [deco1, deco2]<br>
><br>
> @DecoList[0] # NO - CAUSES SYNTAX ERROR<br>
> def foo():<br>
> pass<br>
><br>
> I am sure other guys have their own examples.<br>
><br>
> I am of course not the first person to raise this issue, and I see that<br>
> Guido has a "gut feeling" against allowing a general expression after the<br>
> '@'.<br>
><br>
> BUT - a general expression can be "smuggled in" very easily as a function<br>
> argument:<br>
><br>
> def Identity(x): return x<br>
><br>
> @Identity(DecoList[0]) # THIS WORKS<br>
> def foo():<br>
> pass<br>
><br>
> So - the syntax restriction seems not only inconsistent, but pointless; it<br>
> doesn't forbid anything, but merely means we have to do it in a slightly<br>
> convoluted (unPythonesque) way. So please, Guido, will you reconsider?<br>
><br>
> Best wishes<br>
> Rob Cliffe<br>
</div></div>_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-ideas" target="_blank">http://mail.python.org/mailman/listinfo/python-ideas</a><br>
</blockquote></div><br><br clear="all"><br>-- <br><a href="http://www.ironpythoninaction.com/">http://www.ironpythoninaction.com/</a><br><br><br>