[Python-ideas] Statement local functions and classes (aka PEP 3150 is dead, say 'Hi!' to PEP 403)

Nick Coghlan ncoghlan at gmail.com
Thu Oct 13 14:06:00 CEST 2011


On Thu, Oct 13, 2011 at 7:02 PM, Aaron DeVore <aaron.devore at gmail.com> wrote:
> A clean way to have multiple function could be an issue. Perhaps add a
> syntax to refer to either the first function (@) or a named
> function(@x)? I can't think of a great syntax to group the function
> definitions, though.

One of the key things I realised after reflecting on both Ruby's
blocks and Python's own property descriptor is that it's *OK* to only
support a single function in this construct. There's a wide range of
common use cases where the ability to provide a full capability one
shot function would be quite helpful, especially when it comes to
callback based programming. Even in threaded programming, giving each
thread it's own copy of a function may be a convenient alternative to
using synchronisation locks.

Actually, here's an interesting example based on quickly firing up a
worker thread:

postdef t = threading.Thread(target=def); t.start()
def pointless():
    """A pointless worker thread that does nothing except serve as an example"""
    print("Starting")
    time.sleep(3)
    print("Ending")

>> 1. Leave classes out of it, at least for now. We did that with
>> decorators, and I think it's a reasonable approach to follow.
>
> -1. This sounds useful for classes. I'm not sure what, but it still
> sounds useful.

We need more than that to justify keeping classes in the mix - if we
can't think of clear and compelling use cases, then it's better to
omit the feature for now and see if we really want to include it
later.

>> 2. The initial version should be an alternative to decorator syntax,
>> not an addition to it. That is, you wouldn't be able to mix the first
>> incarnation of a block prefix with ordinary decorators.
>
> That would kill off usage of some handy decorators like functools.wraps:
>
>  :some_func(@)
>  @wraps(other_func)
>  def f(b):
>      # function body

No it wouldn't, they'd just need to be called explicitly:

    postdef some_func(wraps(other_func)(def))
    def f(b):
        # function body

As with classes, I'm tempted to call "YAGNI" (You Ain't Gonna Need It)
on this aspect of the initial specification.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-ideas mailing list