[Python-ideas] Quick idea: defining variables from functions that take the variable name

M.-A. Lemburg mal at egenix.com
Wed Jun 8 03:59:52 EDT 2016


On 07.06.2016 21:49, Nick Coghlan wrote:
> On 7 June 2016 at 11:29, M.-A. Lemburg <mal at egenix.com> wrote:
>> One approach would be to define what a decorator means in front
>> of an expression (since that's currently a SyntaxError), without
>> adding any new syntactic sugar. Here's a sketch...
>>
>> @decorator
>> x = obj
>>
>> compiles to:
>>
>> x = obj
>> decorator('x', obj, lineno)
> 
> As a possible guide to designing the signatures for binding
> decorators, it's probably worth asking what would be needed to make:
> 
>     @bindfunction
>     f = lambda : None
> 
> equivalent to:
> 
>     def f(): pass
> 
> Since the interpreter already sets __module__ and __globals__
> correctly on lambda functions, the main considerations would be to get
> f.__name__ and f.__qualname__ set correctly, which means just the
> immediate target would be insufficient - you'd also want the scope
> naming information that gets included in __qualname__, but is omitted
> from __name__.

Well, in your example it would still be enough:

 >>> f = lambda : None
 >>> f.__qualname__
 '<lambda>'
 >>> f.__name__
 '<lambda>'
 >>> def f(): pass
 ...
 >>> f.__qualname__
 'f'
 >>> f.__name__
 'f'

and even at deeper levels, you could base the new .__qualname__
on the one that is set on the lambda function:

 >>> class C:
 ...  f = lambda : None
 ...
 >>> C.f
 <function C.<lambda> at 0x7f5f838736a8>
 >>> C.f.__qualname__
 'C.<lambda>'
 >>> C.f.__name__
 '<lambda>'

The .__qualname__ is set at the time the lambda is built,
so it is known even correct after making the assignment
in the class definition:

 >>> class C:
 ...  f = lambda : None
 ...  print(f.__qualname__)
 ...
 C.<lambda>

so I guess this all works - much to my own surprise, because
I wouldn't have expected e.g. the last experiment to
actually succeed. Someone did a good job there :-)

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Experts (#1, Jun 08 2016)
>>> Python Projects, Coaching and Consulting ...  http://www.egenix.com/
>>> Python Database Interfaces ...           http://products.egenix.com/
>>> Plone/Zope Database Interfaces ...           http://zope.egenix.com/
________________________________________________________________________

::: We implement business ideas - efficiently in both time and costs :::

   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611
               http://www.egenix.com/company/contact/
                      http://www.malemburg.com/



More information about the Python-ideas mailing list