On 02/03/2022 01:02, Chris Angelico wrote:
On Wed, 2 Mar 2022 at 10:32, Rob Cliffe via Python-ideas
<python-ideas@python.org> wrote:


On 01/03/2022 22:25, Chris Angelico wrote:
On Wed, 2 Mar 2022 at 09:24, Steven D'Aprano <st...@pearwood.info> wrote:
On Tue, Mar 01, 2022 at 04:04:31PM +0000, Rob Cliffe via Python-ideas wrote:

I have use cases for "do exactly once".
Basically a sequence of actions which can be broken off (when something
goes wrong and the whole process should be aborted, or when something
succeeds and there is no need to try alternatives) at various points
with `break`.
      class MyBreak(Exception):
          pass

      try:
          do_this()
          if condition: raise MyBreak
          do_that()
          if condition: raise MyBreak
          do_next_step()
          if condition: raise MyBreak
          do_last_step()
      except MyBreak:
          pass

All this is assuming that you can't refactor it into a function and
'return' each time. That's also a viable option, where applicable.
Yes, it is a viable (even preferable) option when applicable.
But there are times when it is not applicable, or is very inconvenient.
E.g. when a long list of local variables have to be turned into long
verbose error-prone and hard-to maintain lists of parameters and return
values (if the code is factored off into a function).
Inner functions are spectacular for that :)


Well, they can do the job.  'spectacular' is not a word I would use:
(a) you have to define your inner function, then call it:
        def innerfunc():
            <possibly long function body>
        innerfunc()
    which obscures the control flow.
(b) AFAICS If you want to alter variables local to the outer function, you have to declare them non-local in the inner function. (c) AFAIK you can not create identifiers in the inner function which the outer function can "see".  Example:

    def f():
        def innerfunc():
            foo = 1
        innerfunc()
        print(foo)
f()

print(foo) fails.  You have to create foo in the outer function, then declare it non-local:

def f():
    foo = None
    def innerfunc():
        nonlocal foo
        foo = 1
    innerfunc()
    print(foo)

f()

This "works": print(foo) prints 1.
Pretty much as inconvenient as creating parameter and return lists, ISTM.
No, so far I have seen no improvement on this which I use (including a suitable helpful comment, as below) in production code:

        for _ in '1':   # Execute this 'loop' once only (break once we know how to ...)
            <code containing `break`s>

Best wishes,
Rob Cliffe
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/QLJKQNGFP7NFVYVN46UBY3CT2MML7OKQ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to