[Python-Dev] Re: new syntax for wrapping (PEP 318)

Bob Ippolito bob at redivi.com
Wed Feb 25 22:51:24 EST 2004


On Feb 25, 2004, at 9:56 PM, Josiah Carlson wrote:

>> Just a data point from a user: I use classmethod fairly frequently, 
>> and
>> I would *love* to see some syntax to support it.  As has been pointed
>> out before, classmethod (and staticmethod) are a part of the interface
>> of a function, and shouldn't be tacked on to the end of the body.
>> Please let me put them where people (and hopefully pydoc and 
>> pychecker)
>> can easily see them.
>
> I personally don't see the point of using any syntax for wrapping a
> function like so:
>
> class a:
>     def funct(self):
>         pass
>     a = classmethod(a)

This just isn't valid Python code.. but anyways :)

> If we actually test this:
>
>>>> class a:
> ...     def a(self):
> ...             pass
> ...     def b(self):
> ...             pass
> ...     def c(self):
> ...             pass
> ...     a = classmethod(a)
> ...     b = staticmethod(b)
> ...
>>>> foo = a()
>>>> type(foo.a)
> <type 'instancemethod'>
>>>> type(foo.b)
> <type 'function'>
>>>> type(foo.c)
> <type 'instancemethod'>
>
> It is entirely possible that I'm missing something, but according to
> Python 2.3.2, foo.a and foo.c are the same kind of thing, who am I to
> disagree?

What does the type(object) have to do with anything?  I thought people 
have learned by now that it's not wise to use type for much of 
anything.  You should instead opt for (at least) isinstance(..), 
getattr(...) or preferably a more robust adaptation solution such as 
Zope X3's components, Twisted's components, or PyProtocols (a 
subproject of PEAK).

> For another data point, I've never had to use staticmethod or
> classmethod in my code, and have never needed to use function 
> decorators.

I never had to use Python either, but I think it's a great language 
that let's me work more effectively.  There's nothing I can do in 
Python that I couldn't have done in another language, well, except 
enjoy writing code :)

> In general, I am against the use of arbitrary syntax like the 
> following;
>
> class foo:
>     def a(self) [...]:
>         #body
>     def b(self) <...>: #as paul recently suggested
>         #body
>
> Mostly because it leads to newbies asking what the hell it means.  You
> only need to check the c.l.py newsgroup to discover 3-4 messages/week
> asking about the meaning of *args and **kwargs.  If either of the above
> were allowed, new (and seasoned users for a while) would ask, "what 
> does
> this thing mean, I've never seen anything like it before?"
>
> Honesly, a new (or used) keyword would make the most sense, perhaps 
> "as",
> which has been offered before.  At least then people could check the
> documentation index for "as" and get two listings, one for import
> statements, and one for decorator syntax.  I think something like the
> following would make the most sense (it includes the opportunity for
> multi-line decorators as Barry suggests).
>
> class foo:
>     def a(self) as [...]:
>         #body
>
>
> Even though I think the above is the best syntax I've seen so far, that
> doesn't mean that I like it.  Personally, I don't have any use for
> decorators currently, and could see new and old users of Python being
> stymied by examples of this in new code.  Being able to reverse the
> application order of the decorators, and still have it make sense to a
> not-insignificant number of people, means that it could be confusing.

I am fine with the "as" keyword.  I don't really know how 'newbies' 
think, and an extra 4 characters for clarity doesn't bother me at all.  
Not having this syntax requires A WHOLE !@#$*( lot of verbosity and 
repetition, or drastic measures such as alternative compilers (Quixote) 
or really awful terrible introspection hacks (PEAK does stack 
introspection).

I don't really care, as long as it makes usage much shorter than it is 
currently.  I need this syntax, and I will maintain my own patched 
version of Python or alternate compiler if I have to (which is less 
effort than writing code that has to use existing grammar), but I would 
VERY much rather not.

> I understand its application in PyObjC and in the use of staticmethod,
> but for the vast majority of users, I doubt that adding it would
> result in use.  Certainly it seems like a chicken and egg problem 
> (there
> are a few of those being discussed in c.l.py currently), but in all the
> code I've read "in the wild", I've never once seen anyone manually 
> apply
> decorators to functions.

The vast majority of Python programmers either learned Python before it 
had decorators, hasn't read the documentation for it, or just aren't 
writing the kind of code that needs it.  We have these great new style 
classes now, but it's hard to make any good use of them if it's not 
simple to create descriptors and tag things with metadata.

> I suggest a supporter of the PEP take a look through the standard
> library.  If there exists a non-trivial number of examples of its use,
> maybe my opinion would change.  On the other hand, if in the standard
> library, there exists some _very small number_ of examples of manual
> decorators, then perhaps this is application-specific.  I have a 
> feeling
> that including application-specific /syntax/ in Python is frowned upon.

This isn't at all fair, most (almost all?) of the standard library was 
written before Python had any decorators, by people who wanted 
backwards compatibility (for the most part).  Additionally, the current 
grammar makes decorators so !@#$ inconvenient that nobody wants to use 
them unless they have to.  Look no further than any PEAK or PyObjC 
project to see plenty of decorators.  Especially PEAK.

Off the top of my head, this new syntax would be extremely convenient 
for *at least* the following projects and software that uses them:
	ctypes
	Zope X3
	Twisted
	PEAK / PyProtocols
	PyObjC
	(these two are guesses, I can't say this from experience)
	SQLObject
	Quixote

PyObjC and ctypes need the syntax the most, because both projects 
attempt to make low-level libraries easier to extend and use by 
creating a domain specific languages within Python.  Currently, this is 
only a partial success because defining functions and methods is 
actually harder than in ObjC or C respectively due to this severe 
limitation in Python's grammar.  These projects could be extremely 
popular if they were nicer to use.

As far as numbers go, I guarantee you that once this syntax exists, 
people (at least anyone who uses descriptors and doesn't need backwards 
compatibility) will start using it in droves.  If not "vast majority 
users", at least framework/library writers... you know, the people 
writing the software that gets new users and business types excited 
about Python.

As a bonus, some big abusers of lambda such as PEAK (~333 uses), 
Twisted (~268 uses), and the standard library (~295 uses) may end up 
using this syntax instead, because it covers some of the use cases 
where what you want is really some kind of "anonymous code block".

-bob




More information about the Python-Dev mailing list