[Python-ideas] Fwd: Define a method or function attribute outside of a class with the dot operator
Paul Moore
p.f.moore at gmail.com
Fri Feb 10 06:13:51 EST 2017
On 10 February 2017 at 10:45, Markus Meskanen <markusmeskanen at gmail.com> wrote:
> Keep in mind that the extra syntax is *very* minor, and goes hand-to-hand
> with the existing attribute access syntax. Basically it's taking the
> existing syntax to one more place, where it in my opinion should have been
> since long ago.
In implementation terms, the syntax change is not as minor as you
suggest. At the moment, the syntax for a "def" statement is:
funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->"
expression] ":" suite
funcname ::= identifier
You're proposing replacing "identifier" as the definition of a
"funcname" with... what? dotted_name might work, but that opens up the
possibility of
class Foo:
pass
foo = Foo
def foo.a(self): pass
(note I'm defining a method on the *instance*, not on the class). Do
you want to allow that? What about "def a.b.c.d.e(): pass" (no self as
argument, deeply nested instance attribute).
Furthermore, once we open up this possibility, I would expect requests
for things like
func_table = {}
func_table["foo"] = lambda a, b: a+b
def func_table["bar"] (a,b):
return a-b
pretty quickly. How would you respond to those? (Setting up function
tables is a much more common and reasonable need than monkeypatching
classes).
Your proposal is clear enough in terms of your intent, but the
implementation details are non-trivial.
Paul
PS Personally, I'm slightly in favour of the idea in principle, but I
don't think it's a useful enough addition to warrant having to deal
with all the questions I note above.
More information about the Python-ideas
mailing list