[Python-3000] 100% backwards compatible parenless function call statements

Guido van Rossum guido at python.org
Tue Aug 14 04:24:20 CEST 2007


This is a topic for python-ideas, not python-3000.

To be absolutely brutally honest, it doesn't look like you understand
parsing well enough to be able to write a PEP. E.g. why is

  cos(3)+4

not interpreted as

  cos((3)+4)

in your proposal?

Python's predecessor had something like this, and they *did* do it
properly. The result was that if you wanted the other interpretation
you'd have to write

  (cos 3) + 4

Similarly in Haskell, I believe.

In any case, I don't believe the claim from the subject, especially if
you don't distinguish between

  f.close

and

  f.close()

How would you even know that 'close' is a method and not an attibute?
E.g. how do you avoid interpreting

  f.closed

as

  f.closed()

(which would be a TypeError)?

Skeptically,

--Guido

On 8/13/07, Chris Monsanto <chris.monsanto at gmail.com> wrote:
> Since Python makes such a distinction between statements and expressions, I
> am proposing that function calls as statements should be allowed to omit
> parentheses. What I am proposing is 100% compatible with Python 2.x's
> behavior of function calls; so those uncomfortable with this (basic) idea
> can continue to use parens in their function calls. Expressions still
> require parens because of ambiguity and clarity issues.
>
> --Some examples:--
>
> print "Parenless function call!", file=my_file
>
> print(".. but this is still allowed")
>
> # We still need parens for calls to functions where the sole argument is a
> tuple
> # But you'd have to do this anyway in Python 2.x... nothing lost.
> print((1, 2))
>
> # Need parens if the function call isnt the only thing in the statement
> cos(3) + 4
>
> # Need parens if function call isnt a statement, otherwise how would we get
> the function itself?
> x = cos(3)
>
> # Make a the value of my_func...
> my_func2 = my_func
> my_func2 # call other function
> my_func2() # call it again
>
> # Method call?
> f = open("myfile")
> f.close
>
> # Chained method
> obj.something().somethinganother().yeah
>
> --Notes:--
>
> A lot of other things in Python 2.x/Python 3k at the moment have this same
> behavior...
>
> # No parens required
> x, y = b, a
>
> # But sometimes they are
> func((1, 2))
>
> # Generator expressions sometimes don't need parens
> func(i for i in list)
>
> # But sometimes they do
> func(a, (i for i in list))
>
> --Pros:--
>
> 1) Removes unnecessary verbosity for the majority of situations.
> 2) Python 2.x code works the same unmodified.
> 3) No weird stuff with non-first class objects, ala Ruby meth.call().
> Functions still remain assignable to other values without other trickery.
> 4) Because it's completely backwards compatible, you could even have
> something like from __future__ import parenless in Python 2.6 for a
> transition.
>
> --Cons:--
>
> 1) Can't type "func" bare in interpreter to get its repr. I think this is a
> non-issue; I personally never do this, and with parenless calls you can just
> type "repr func" anyway. Specifically I think this shouldn't be considered
> because in scripts doing something like " f.close" does absolutely nothing
> and giving it some functionality would be nice. It also solves one of the
> Python gotchas found here:
> http://www.ferg.org/projects/python_gotchas.html
> (specifically #5)
>
> I'm willing to write up a proper PEP if anyone is interested in the idea. I
> figured I'd poll around first.
>
>
>
> _______________________________________________
> Python-3000 mailing list
> Python-3000 at python.org
> http://mail.python.org/mailman/listinfo/python-3000
> Unsubscribe:
> http://mail.python.org/mailman/options/python-3000/guido%40python.org
>
>


-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-3000 mailing list