Why can function definitions only use identifiers, and not attribute references or any other primaries?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Fri Apr 24 04:27:15 EDT 2009


On Thu, 23 Apr 2009 10:48:57 -0700, Scott David Daniels wrote:

> I am afraid it will make it too easy to define functions in other
> modules remotely, a tempting sharp stick to poke your eye out with. 

It's not terribly difficult to do so already:

>>> def spam():
...     return "spam spam spam"
...
>>> import math
>>> math.spam = spam
>>> math.spam()
'spam spam spam'


> Note
> also, that it will not be so easy to find the definition of a function
> provided as a argument to a failing function.  Right now you can get the
> function name and (with a bit more effort) its module. Imagine debugging
> a pile of code that includes a module with:
>      import random
>      def random.random():
>          return .42

Easy-peasy.

>>> import random
>>> random.random = lambda: 0.42
>>>
>>> random.random()
0.41999999999999998
>>> random.random.__name__
'<lambda>'
>>> random.random.__module__
'__main__'


Sure, if somebody wants to really work at it, they could create a 
function that looks exactly like the original, including claiming to come 
from the same module, but that's possible now anyway.

I don't think the proposed syntax is useful because it doesn't actually 
gain us anything. Currently, you add a function to a class at class 
creation time:

class Spam(object):
    def spam(self):
        return "spam spam spam"

Adding functions to a class after the class already exists is rare, but 
not unheard of. Currently you can do this:

def ham(self):
    return "ham is not spam"

Spam.ham = ham
del ham  # if you can be bothered


And you're done. The proposal gives us this:

class Spam(object):
    pass  # Need to have a class before you can add methods to it.

def Spam.spam(self):
    return "spam spam spam"

def Spam.ham(self):
    return "ham is not spam"



Whatever benefit there might be from doing this, it's so minor I don't 
think it's worth the effort to implement it. Unlike decorators, I'd be 
surprised if it opens the door to bigger and better things.



-- 
Steven



More information about the Python-list mailing list