Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How work pre-defined descriptors in functions?

Python functions have a descriptors. I believe that in most cases I shouldn't use this directly but I want to know how works this feature? I tried a couple of manipulations with such an objects:

  1.  

    def a():
        return 'x' 
    
    a.__get__.__doc__
    'descr.__get__(obj[, type]) -> value'
    

    What is the obj and what is the type?

  2.  

    >>> a.__get__()
    TypeError:  expected at least 1 arguments, got 0
    
    >>> a.__get__('s')
    <bound method ?.a of 's'>
    
    >>> a.__get__('s')()
    TypeError: a() takes no arguments (1 given)
    

    Sure that I can't do this trick with functions which take no arguments. Is it required just only to call functions with arguments?

  3.  

    >>> def d(arg1, arg2, arg3):
            return arg1, arg2, arg3
    >>> d.__get__('s')('x', 'a')
    ('s', 'x', 'a')
    

    Why the first argument taken directly by __get__, and everything else by returned object?

like image 303
I159 Avatar asked Feb 10 '13 16:02

I159


1 Answers

a.__get__ is a way to bind a function to an object. Thus:

class C(object):
    pass

def a(s):
    return 12

a = a.__get__(C)

is the rough equivalent of

class C(object):
    def a(self):
        return 12

(Though it's not a good idea to do it this way. For one thing, C won't know that it has a bound method called a, which you can confirm by doing dir(C). Basically, the __get__ does just one part of the process of binding).

That's why you can't do this for a function that takes no arguments- it must take that first argument (traditionally self) that passes the specific instance.

like image 160
David Robinson Avatar answered Sep 30 '22 13:09

David Robinson