"Goto" statement in Python
Rob Gaddi
rgaddi at highlandtechnology.invalid
Wed Apr 12 20:17:37 EDT 2017
On 04/12/2017 04:42 PM, Mikhail V wrote:
> On 12 April 2017 at 02:44, Nathan Ernst <nathan.ernst at gmail.com> wrote:
>> goto is a misunderstood and much misaligned creature. It is a very useful
>> feature, but like nearly any programming construct can be abused.
>>
>> Constructs like 'break', 'continue' or 'next' in languages like Python or
>> C/C++ are goto's with implied labels.
>>
>> As Mikhail said, goto's can be great to break out of nested loops (only a
>> handful of languages support named 'breaks').
>>
>> So, instead of:
>> bool found = false;
>> for (int i = 0; i = ...; ++i)
>> {
>> for (int h = 0; h = ...; ++h)
>> {
>> if (some_condition)
>> found = true;
>> }
>> if (found) break;
>> }
>>
>> You can have:
>>
>> for (int i = 0; i = ...; ++i)
>> {
>> for (int h = 0; h = ...; ++h)
>> {
>> if (some_condition)
>> goto found;
>> }
>> }
>> // not found
>>
>> found:
>> // handle found
>>
>> The second is better for a number of reasons: it's clearer. It has fewer
>> variables (smaller stack), it has fewer branches (better for the CPU's
>> branch prediction), and it has fewer instructions (better for CPU
>> instruction cache). This is a trivial, contrived example, but I've seen
>> more than 4x nested loops using an exit flag like this (at every level of
>> the loops) that could have been replaced with a lot less code.
>>
>> People need to stop drinking "X is considered harmful." Even Dijkstra later
>> lamented that his "Goto considered harmful" paper was misinterpreted and
>> misrepresented as advocating that goto should never be used.
>>
>> Additionally, I'd recommend everyone read '"Considered Harmful" Essays
>> Considered Harmful': http://meyerweb.com/eric/comment/chech.html
>>
>> Regards,
>> Nate
>>
>
>
>
> Here are recent related discussions about exiting from
> nested loops (at least seems to be so):
> https://mail.python.org/pipermail/python-ideas/2017-March/044932.html
> https://mail.python.org/pipermail/python-ideas/2017-March/045049.html
>
> I personally have difficulties to fully understand some
> of the examples given in those proposals, namely
> that proposals were thought for other(?) purposes also,
> not only breaking nested loops.
>
> At a first glance it seems to me that "goto" would solve
> the nested breaking problem and in a nice flexible way.
> (correct me if I am wrong, probably I'm missing something)
>
> So besides nested loops, in my practice I had occasions
> when I would want to use "goto".
> It would be fair to say that those occasions are not so common,
> but I'll try to give an example. Say, there is some
> pure procedural processing for some simple task
> and I don't want to make the script heavy and just
> care for the clarity:
>
> ===========
> Log = ""
> S = "lorem ipsum"
>
> for s in S:
> if s == "i" :
> message = "found on stage 1"
> goto .output
>
> S = S + " hello world"
> for s in S:
> if s == "d" :
> message = "found on stage 2"
> goto .output
>
> print "not found"
> print "S = ", S
> goto .exit
>
> .output
> print message
> Log = Log + message
>
> .exit:
> print "exiting"
> =============
>
> For me it looks clear and I'd say easy to comprehend,
> Main critic would be obviously that it is not
> a good, *scalable application*, but quite often I don't
> even have this in mind, and just want to express a
> step-by-step direct instructions.
> In this case sticking any "def():.." inside the script
> does not make any sense for me. Simplicity here
> reflects the fact that this code represents
> exactly what I want the computer to do.
>
> And a working variant of this would be like:
>
> ===========
> Log = ""
> found = False
> Error = False
> S = "lorem ipsum"
>
> if not found:
> for s in S:
> if s == "i" :
> message = "found on stage 1"
> found = True
>
> if not found:
> S = S + " hello world"
> for s in S:
> if s == "d" :
> message = "found on stage 2"
> found = True
>
> if not found:
> Error = True
> print "Error : not found"
> print "S = ", S
>
>
> if not Error:
> print message
> Log = Log + message
>
> print "exiting"
> ==============
>
> This is working code, but I would say there is
> a lot extra indentation, and if I don't care about
> application scalability, those are just adding noise
> and I it needs some boolean flags.
>
> I am not sure what examples to add here ...
> it seems to me that e.g. if I would use Python
> for modelling "pipeline" algorithms
> this could be helpful also.
>
> Now if I count in the nested loops breaking problematic,
> seems that there is at least a prerequisite for existence of "goto".
> Am I right?
>
>
> Mikhail
>
def finder:
for s in S:
if s == 'i':
return 'found on stage 1'
S = S + ' hello world'
for s in S:
if s == 'd':
return 'found on stage 2'
raise ValueError('not found; S=' + S)
try:
message = finder()
print(message)
log += message
except ValueError as e:
print(e)
--
Rob Gaddi, Highland Technology -- www.highlandtechnology.com
Email address domain is currently out of order. See above to fix.
More information about the Python-list
mailing list