Rocksolid Light

Welcome to novaBBS (click a section below)

mail  files  register  newsreader  groups  login

Message-ID:  

The less time planning, the more time programming.


devel / comp.lang.python / Re: Behavior of the for-else construct

SubjectAuthor
o Re: Behavior of the for-else constructAvi Gross

1
Re: Behavior of the for-else construct

<mailman.149.1646362938.2329.python-list@python.org>

  copy mid

https://www.novabbs.com/devel/article-flat.php?id=17328&group=comp.lang.python#17328

  copy link   Newsgroups: comp.lang.python
Path: i2pn2.org!i2pn.org!news.swapon.de!fu-berlin.de!uni-berlin.de!not-for-mail
From: avigr...@verizon.net (Avi Gross)
Newsgroups: comp.lang.python
Subject: Re: Behavior of the for-else construct
Date: Fri, 4 Mar 2022 03:02:14 +0000 (UTC)
Lines: 277
Message-ID: <mailman.149.1646362938.2329.python-list@python.org>
References: <CALq4Z0-fJk-HOu0ka2kPrOioPYAh3e3zbziwetUDmAAx1U1LMw@mail.gmail.com>
<YiFCPlGC+2aRIR0K@shallowsky.com>
<21739669.459456.1646348879560@mail.yahoo.com>
<e3544242-cd54-05d3-2101-5b9fedc1c13e@btinternet.com>
<621325684.471007.1646354302946@mail.yahoo.com>
<77101e25-a341-ee34-ab6b-abc60f858430@btinternet.com>
<459805806.495251.1646362934339@mail.yahoo.com>
Reply-To: Avi Gross <avigross@verizon.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
X-Trace: news.uni-berlin.de AKjAHuET6ufQSXSt279U3g0x7/CCkIPjsgm0MNRvV2mg==
Return-Path: <avigross@verizon.net>
X-Original-To: python-list@python.org
Delivered-To: python-list@mail.python.org
Authentication-Results: mail.python.org; dkim=pass
reason="2048-bit key; unprotected key"
header.d=verizon.net header.i=@verizon.net header.b=QcaEe0XB;
dkim-adsp=pass; dkim-atps=neutral
X-Spam-Status: OK 0.002
X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'comments': 0.03;
'python?': 0.03; '(which': 0.04; '2022': 0.05; 'fairly': 0.05;
'variable': 0.05; 'e.g.': 0.07; 'else.': 0.07; 'exit': 0.07;
'lets': 0.07; 'loop': 0.07; 'mar': 0.07; 'modules': 0.07;
'spaces': 0.07; 'used.': 0.07; 'apparently': 0.09; 'code?': 0.09;
'construct': 0.09; 'derived': 0.09; 'else:': 0.09; 'emacs': 0.09;
'ended': 0.09; 'filtering': 0.09; 'identical': 0.09; 'it)': 0.09;
'language,': 0.09; 'numpy': 0.09; 'operators': 0.09; 'pandas':
0.09; 'practice.': 0.09; 'readable': 0.09; 'represents': 0.09;
'situation,': 0.09; 'speak.': 0.09; 'theory': 0.09; 'treated':
0.09; 'typically': 0.09; 'way?': 0.09; 'writes:': 0.09;
'\xe2\x86\x92': 0.09; 'url:mailman': 0.15; 'that.': 0.15;
'alphabets': 0.16; 'answer.': 0.16; 'applies': 0.16; 'avi': 0.16;
'columns': 0.16; 'considered,': 0.16; 'constantly': 0.16;
'construct.': 0.16; 'does,': 0.16; 'explaining': 0.16;
'extensions': 0.16; 'feature.': 0.16; 'filename': 0.16;
'filenames': 0.16; 'flow.': 0.16; 'follows': 0.16; 'gross': 0.16;
'idea.': 0.16; 'instead.': 0.16; 'interpreter': 0.16;
'languages.': 0.16; 'level,': 0.16; 'matched': 0.16; 'mentioned,':
0.16; 'nested': 0.16; 'odd': 0.16; 'ones.': 0.16; 'order?': 0.16;
'recall': 0.16; 'reminds': 0.16; 'sentences,': 0.16; 'sigh.':
0.16; 'sounds': 0.16; 'subject:else': 0.16; 'subset': 0.16;
'symbol': 0.16; 'tends': 0.16; 'tries': 0.16; 'triggered': 0.16;
'typing': 0.16; 'unfortunate': 0.16; 'vector': 0.16; 'wrapper':
0.16; 'wrote:': 0.16; 'python': 0.16; 'code.': 0.17; 'instead':
0.17; "can't": 0.17; 'uses': 0.19; 'gnu': 0.19; 'implement': 0.19;
'thu,': 0.19; 'to:addr:python-list': 0.20; 'language': 0.21;
'machine': 0.22; 'languages': 0.22; 'sent:': 0.78; 'major': 0.78;
'header:Reply-To:1': 0.79; 'leads': 0.81; 'left': 0.83;
'thousand': 0.84; 'up,': 0.84; 'copyright': 0.84; '(other': 0.84;
'balanced': 0.84; 'bind': 0.84; 'characters': 0.84; 'choices':
0.84; 'code)': 0.84; 'comments,': 0.84; 'decent': 0.84;
'desperately': 0.84; 'difference.': 0.84; 'drive.': 0.84;
'entered': 0.84; 'experiment': 0.84; 'implies': 0.84; 'inclined':
0.84; 'interpreters': 0.84; 'macro': 0.84; 'means,': 0.84;
'mysterious': 0.84; 'pairs': 0.84; 'pause': 0.84; 'pointing':
0.84; 'quotes': 0.84; 'reflecting': 0.84; 'remind': 0.84; 'rob':
0.84; 'signals': 0.84; 'signs': 0.84; 'strings': 0.84; 'was.':
0.84; 'weird': 0.84; 'differently': 0.91; 'doing.': 0.91;
'expensive': 0.91; 'expensive.': 0.91; 'holds': 0.91; 'plays':
0.91; 'react': 0.91; 'viewed': 0.93; 'mind,': 0.93; 'newly': 0.93;
'cut': 0.95; 'keywords': 0.95; 'turned': 0.95
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=verizon.net; s=a2048;
t=1646362935; bh=GCLTncL3rJYNdnysYXXUdjh89md6VOUv7hmucqS2tCs=;
h=Date:From:Reply-To:To:In-Reply-To:References:Subject:From:Subject:Reply-To;
b=QcaEe0XBXcLW6bSaMhzQyeKQdRbhlKYTeyhick00epAHANmP8x+PfCN7GpX6TGA4I6NDE4bJRDBq438hvvklAnrFG4bhFxe/QoDjW9uvNBJ/EPZFzaVeKyB+eTsu7ZNUT3GgNeGzC7q4eJKtNr/3+NOwnuisWp+mB3zzQPHpyJYEQsP7BTWbpxcumjwfIACID+uJTf0qrUvEjqHY9/XA69CmbKtzoLPYcqsUavxxUjVfUe4aJx/GDtN8W99ImJWuHG9kVLwVP/5e0XT6wHfos2qusiFpTdppCpme9uxklsbMfMZemvQH+8Kjb9Ms/UJJ5Ax2It/5gm1kHDwK+IBj9w==
X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048;
t=1646362935; bh=FmITL3/QMDmY+57Oi4JDWn2ccydB4OMWi2jh0X5DfFQ=;
h=X-Sonic-MF:Date:From:To:Subject:From:Subject;
b=DhqKGWqtb9zk7xJhQKyt1Uqys95TIaxty1MIGikMiHXJnjUuyQ4gx3f9RNuryfw9Uy94cyNeH1qwANHxSv65sSt9FcuAFJDbygWp2YoqD1ZtAzrMXyaJ+yB75x0CxZfTf2CYy5zOa5B8FU/OITeUGtqqVy74f2RpVhTwj+lYpx2CqSZ1bc8v0YDF90xb/Iwwn22Sko5mqeb1FDE9pnTK0q7xzNAT1R3eS2OXMQ7VxcxnjTL7qbw/sHy0KtsxsY/D9ZALw9lbIBoyewkcndDV5pJtq2pLvt/3Of/L7mKJDfosSXxOZYzx3IXD8JTDHoeMKfMZgMNn3zMZkm6Qmf/nHQ==
X-YMail-OSG: tl707hMVM1mX47QW9HHuIW1.Qhmr8xxERcFlRkP2HqFWKNRrcaV_C_ia_IQmPWv
fdFjRRlXwPLGp.OzLX782cY6hrtihtUaS4GFsvwr6Eow8wzbmJX0sxCOecPkCr4T68Ua.RIWU5_6
ikAEWVGX4FXGn7F5YbxUzOGp2CqUBPF3ieL.KifHg_FPIsJyYHejucClrtI8mLt4wWSwGXPhCHNZ
sYwHesqVc87cAruA21vYFyK8_rAyje4v7Rg9cXw.wbQUr0ee.eBuICXf8_Nbmhb7ytERfLqvbbiq
lR8GrvEFScxUkr9GQ0zknTw4P5TdRKQWEw5dI70UP5O40dsOiYthVSI9JN.4cFs8OdrR5EufX9.k
USn5tzi.wyldVB7Btm5OLK2DT5x19C8u2lcl6R99.h7ojbWlh2oOtYs_8VnHUaHFKGtTcKJb77G9
MQK3f1X74z5cALp3XcuytrQkwAx9F4DZzplmEZkfbJSM5a_pc3WnGBPKx1yQXiIojxj2uPZUf7hO
AU4YkN6ngGIH53Kh.Q94rPn6p9_OF4K.pmrhHDPRt05RtzOf9CI8iRQfFtV_R6GXiLwk6rV5VITH
yH9iYBccWhR3B2UvXXN1AJM4uIwgWqKR.OlgXc4H2YzWPw7zuugdeVv8KslZpa56qPrk1zlEmhB_
KdRUC7upuxor.wfldA_B4p9q3Y7IFCEG_PglMjzudcSlztvTVMQkzDMSy9cnCN1nJWktv9NqVP5p
uWM943ZkouM_3IgLINAYgH.48s5srlO3Sg4rJsBrzuwOy4BWJnjNmZeSPg5myfeKpIzg_vo4chog
sMQ4aZDtjwHSeVU47mf8NLn6fpTIWIpqtkRV8ZpAP991x8Z7HtheWqdQMLz0_vbEhPR8mx8U_xT9
U6ysARl__0ZeEank.x74MBweULpr5ia9_1ykAXSs8D4e4e_JPdcRfGRXuZ0v_wvQ1rzpNesKAteA
2YU2.XgXmlfA4diuLXke9GDgkTtcn.UPjankT5thMXEeG84K2Rrsufg7zlGTtZQgCu9dgHAVGt0t
GE4kDBxM6bvMJ6f3NQ8T0XryzJT_AEEb1osV5Oo4iYZOFRVBtiIt67zOa0C10GFNbzor5qNgFosN
16oRM3iH0kzeak9u41C095Vg9vo2dGdb3Q.FozVBQKveyAdDH_QNU1_3L7OluTv4zPQ245TJFi5e
vGqVdL9BViL3HRupNQifFEnLhvIB1Uxgldm2gr48hfwT.ras9hj0vpGNKsgHAXfS5HzByyoLPOQ9
c2c4Be4SQyikGPAgio.xaw0Sk7HOVLkiRR_v6XXsSgOX0BZk5MPRKHHYfswJH82p8UvUDA9eW.dP
GNhGV95zZLgqsA0l0cDJIXJDdks2E_9ki4HTghIoi0QV.p1vFxKaXziys5j3HyEatUUfOAA5hkpf
dH5DN13JSXr1gzgXjxwEDky8uQY77SyKN6UuVu6oP6hrr79sJk5TlVfV.YcpJ_pkQWfhJ4rs6IyO
uObICXPhKUJcTMK.VgRuT.fsICQRQl1mcKyfgdhJwKgxZJ321H5UJI55I7yYXG6_4wwYx8jUyOkw
3KxOGG54Zm_eXhirP1e7Znh57BfFJdeDzOuq_x4WsvlnihSFeVk09TfPnYexFhbYGDqRlJ2yLhJQ
Khy3oM.FUGb9pwWEQUX5RYcSd1P6heIGF2CiLE5tqz38NaD34TA0egIULs06WUp1vphyNYWyMucz
jEldOgwNRfhLTEopX0sL0TWLzphivoBRJy_XNlFzFKxrj9uVyrU45h5_kV3fz5CUyrHZPGar0FYQ
cwcolMiFeV__2Yraj_VQgUnTI6BdyMQavZ6FUxYpHoUyMaTW3fcQZmVSijoD1ofQgnEcIEX.tnTq
zzWr_oX34QLb91YEuSmm31AAaANzPJSDwsV7lDsjBi8owZ_CYFQ5nCsq4rm.poXvnuAp2PJXSDvx
78tCjmVA.x3XyCFZqmHtISdpFpIhu27HAYvvMLPoD_4.ECEgBgd1QFIaDYE_Q240tNGxkkMbnpmw
tQRp6T.p7tHBwIGGkpj0iyqFhijasPLGkpXYhHgQs0hw6XD9cQWJC3GfXOy.4zmQQEMRJY1FZAqq
KOVqY_ujNh5F0aXVZ.B_oBTNgAflnv86qf15kJ6ytj5GaTq02aj8d4iW6KIaZwyv3ovlVFCacgr0
kQyufaAcxT9eVCFyE54nqhj4m6rnb4MWUqMI6IgOc0Xu3xqmFdDUPl9f1boxaGqNb7JMPm66QSBR
XqC3Es9843ThAf5LnPTxf7kpGbw--
X-Sonic-MF: <avigross@verizon.net>
In-Reply-To: <77101e25-a341-ee34-ab6b-abc60f858430@btinternet.com>
X-Mailer: WebService/1.1.19724 aolwebmail
X-BeenThere: python-list@python.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: General discussion list for the Python programming language
<python-list.python.org>
List-Unsubscribe: <https://mail.python.org/mailman/options/python-list>,
<mailto:python-list-request@python.org?subject=unsubscribe>
List-Archive: <https://mail.python.org/pipermail/python-list/>
List-Post: <mailto:python-list@python.org>
List-Help: <mailto:python-list-request@python.org?subject=help>
List-Subscribe: <https://mail.python.org/mailman/listinfo/python-list>,
<mailto:python-list-request@python.org?subject=subscribe>
X-Mailman-Original-Message-ID: <459805806.495251.1646362934339@mail.yahoo.com>
X-Mailman-Original-References: <CALq4Z0-fJk-HOu0ka2kPrOioPYAh3e3zbziwetUDmAAx1U1LMw@mail.gmail.com>
<YiFCPlGC+2aRIR0K@shallowsky.com>
<21739669.459456.1646348879560@mail.yahoo.com>
<e3544242-cd54-05d3-2101-5b9fedc1c13e@btinternet.com>
<621325684.471007.1646354302946@mail.yahoo.com>
<77101e25-a341-ee34-ab6b-abc60f858430@btinternet.com>
 by: Avi Gross - Fri, 4 Mar 2022 03:02 UTC

Rob,

I consider my comments in code I write to be a (silent) part of the code, or worse, some code I commented out but want to be able to look at.

I often have code like:

# NOTE you can turn on one of the following that applies to your situation
# and comment out the others but leave them in place.
FILENAME = "C: ..."
#FILENAME = "I: ...

The second line is uncommented if this is run on another machine where the file is on the I: drive. Often code I write is sent to someone who has to make it work on their machine or selectively has regions turned off.

# Decide if the next section should be run by selecting the line that represents your needed.
NORMALIZE = True
# NORMALIZE = False

if (NORMALIZE):
...

In cases like the above, which are not the majority of how I use comments, keeping it as I defined it makes sense even if some of the commented code is not running. It makes it easier to make customizations. I often have requests for example to read in a .CSV and depending on the situation, make multiple transformations to it that can include removing columns or filtering out rows, normalizing one or more columns, dealing with outliers beyond some designated level, creating new derived columns based on existing ones, or a Boolean reflecting some complex condition, or grouping it some way or merging it with other data and so on. If writing for myself, I might do it all in one pipeline. But if writing it for someone who plays games and tries this versus that, then something like the above, with suitable comments, lets them experiment by turning sections on and off and other forms of customization. I consider the presence of comments a serious part of what i deliver.

Yes, the interpreter (and sometimes compiler) strips them but leaving them in the source file does not strike me as expensive. Once removed, I consider the person who did it suspect and am less inclined to work with them. Consider code with an embedded copyright of some sort (or apparently GNU has a copyleft) and whether it is valid to separate that from the code?

And note that some code we write may be quite elegant but also rather mysterious and seeing it again a year later it may not be easy to see why we did that and whether some other way might not work as well. Decent comments explaining the algorithm and why choices were made may make all the difference. Or, they may make it easy to see how to convert the code to deal with one more or one less variable by changing it in the right places consistently..

To answer something Chris said and was also mentioned here, I do not consider language design to be easy let alone implementing it. Not at all. BUT I think some changes can be straightforward. Having a symbol like a curly brace mean three new things may be tough to implement. Allowing a new symbol in an expanded set of characters seems more straightforward.

Consider an arrow symbol → pointing to the right and another pointing the other way. Could we add the symbol to the language as a single character, albeit implemented using multiple bytes? If my editor let me insert the darn thing, it might then be a reasonable use for some construct in the language unique and new. Maybe the language would use the notation to hold objects holding a set and not confuse the notations for sets and dictionaries as Python ended up doing. (Yes, I know it is NOT confusing in some ways as one holds key:value pairs and the other just value, but making an empty set now requires the notation of set() while an empty dictionary is {} right?

So how hard is it for a newly designed language to recognize any use of one arrow and expect everything up to the next arrow (pointing back) to be the contents of a set? It sounds a tad easier than now when Python interpreters have to pause when they see an open bracket and read what follows to see if everything beyond uses dictionary notation before it decides.

But NO, I am not volunteering to do any of that. A language with too many symbols may be far worse. We cannot give every single object type their own symbols. But a few more than we have now might make it easier to create objects Python omitted and numpy and pandas and other modules had to add back the hard way.

The only reason this is coming up is teh discussion of how various people react to the exact choice of how to add a new feature. I doubt people will like many choices in a new language created sort of like I describe, either. And nobody wants a new keyboard with a thousand keys, even if their language is Chinese. But there are days I want one a bit like that as I often write, as mentioned, in languages with additional characters or entirely other alphabets. Sigh.

Life is complicated, then you die and it simplifies.

-----Original Message-----
From: Rob Cliffe via Python-list <python-list@python.org>
To: python-list@python.org
Sent: Thu, Mar 3, 2022 8:41 pm
Subject: Re: Behavior of the for-else construct

On 04/03/2022 00:38, Avi Gross via Python-list wrote:
> Rob,
>
> I regularly code with lots of comments like the one you describe, or mark the end of a region that started on an earlier screen such as a deeply nested construct.
So do I (and not just in Python).  It's good practice.
>
> I have had problems though when I have shared such code and the recipient strips my comments and then later wants me to make changes or even just explain it! My reply tends to be unprintable as in, well, never mind!
Quite justified.  But why not make changes to/explain from *your*
version, not his?
>
> This leads to a question I constantly ask. If you were free to design a brand new language now, what would you do different that existing languages have had to deal with the hard way?
That's such a big question that I can't give an adequate answer.
>
> I recall when filenames and extensions had a limited number of characters allowed and embedded spaces were verboten. This regularity made lots of code possible but then some bright people insisted on allowing spaces and you can no longer easily do things like expand *.c into a long line of text and then unambiguously work on one file name at a time. You can often now create a name like "was file1.c and now is file2.c" and it seems acceptable. Yes, you can work around things and get a vector or list of strings and not a command line of text and all things considered, people can get as much or more work done.
>
> I have seen major struggles to get other character sets into languages. Any new language typically should have this built in from scratch and should consider adding non-ASCII characters into the mix. Mathematicians often use lots of weird braces/brackets as an example while normal programs are limited to [{( and maybe < and their counterparts. This leads to odd Python behavior (other languages too) where symbols are re-used ad nauseam. { can mean set or dictionary or simply some other way to group code.
>
> So I would love to see some key that allows you to do something like L* to mean the combination is a left bracket and should be treated as the beginning of a sequence expected to end in R* or perhaps *R. That would allow many other symbols to be viewed as balanced entities. Think of how Python expanded using single and double quotes (which arguably might work better if balanced this way) to sometimes using triple quotes to putting letters like "b" or "f" in front to make it a special kind of string.
>
> But I suspect programming might just get harder for those who would not appreciate a language that used (many) hundreds of symbols.
+1.  Just remembering how to type them all would be a burden.

>  I do work in many alphabets and many of them pronounce and use letters that look familiar in very different ways and sound them differently and invent new ones. Every time I learn another human language, I have to both incorporate the new symbols and rules and also segregate them a bit from identical or similar things in the languages I already speak. It can be quite a chore. But still, I suspect many people are already familiar with symbols such as from set Theory such as subset and superset that could be used as another pair of parentheses of some type Having a way to enter them using keyboards is a challenge.
>
> Back to the topic, I was thinking wickedly of a way to extend the FOR loop with existing keywords while sounding a tad ominous is not with  an ELSE but a FOR ... OR ELSE ...
>
>
> -----Original Message-----
> From: Rob Cliffe via Python-list <python-list@python.org>
> To: python-list@python.org
> Sent: Thu, Mar 3, 2022 7:13 pm
> Subject: Re: Behavior of the for-else construct
>
>
> I find it so hard to remember what `for ... else` means that on the very
> few occasions I have used it, I ALWAYS put a comment alongside/below the
> `else` to remind myself (and anyone else unfortunate enough to read my
> code) what triggers it, e.g.
>
>      for item in search_list:
>          ...
>          ... break
>      else: # if no item in search_list matched the criteria
>
> You get the idea.
> If I really want to remember what this construct means, I remind myself
> that `else` here really means `no break`.  Would have been better if it
> had been spelt `nobreak` or similar in the first place.
> Rob Cliffe
>
>
> On 03/03/2022 23:07, Avi Gross via Python-list wrote:
>> The drumbeat I keep hearing is that some people hear/see the same word as implying something else. ELSE is ambiguous in the context it is used.
>>
>> And naturally, since nobody desperately wants to use non-reserved keywords, nobody seems ready to use a word like INSTEAD instead.
>>
>> Ideally, a language should be extendable and some languages like R allow you to place all kinds of things inside percent signs to make new operators like %*% or %PIPE% ...
>>
>> Just because some feature may be wanted is not a good reason to overly complicate a language. Can you imagine how hard it would be both to implement and read something like:
>>
>> ...
>> ELSE:
>>       ...
>> OK:
>>       ...
>> FINALLY:
>>       ...
>> ULTIMATELY:
>>       ...
>>
>> What if multiple of things like the above example need to be triggered in some particular order?
>>
>> I have to wonder if some new form of wrapper might have made as much sense as in you wrap your loop in something that sets up and traps various signals that are then produced under conditions specified such as the loop not being entered as the starting condition is sort of null, or an exit due to a break or simply because the code itself throws that signal to be caught ....
>>
>> This reminds me a bit of how some programs add so much functionality because someone thought of it without wondering if anyone (including the ones who sponsored it) would ever want to use it or remember it is there or how. I recall how a version of emacs had a transpose-letter function so after typing "teh" you could hit control-t and a little mock LISP macro would go back and co a cut and go forward and do a paste and leave the cursor where it was. That was sometimes useful, but often just as easy to backspace and retype. But I recall gleefully adding a transpose for words, sentences, paragraphs and was going to add more but I was running out of keystrokes to bind them to and besides it can be fairly easy to select items and yank them and move to where you want them and replace them.
>>
>> To make changes in a language is sometimes really expensive but also dangerous. A "free" language must be added to sparingly and with so many requests, perhaps only a few non bug-fixes can seriously be considered.
>>
>>
>>
>> -----Original Message-----
>> From: Akkana Peck <akkana@shallowsky.com>
>> To: python-list@python.org
>> Sent: Thu, Mar 3, 2022 5:33 pm
>> Subject: Re: Behavior of the for-else construct
>>
>> computermaster360 writes:
>>> I want to make a little survey here.
>>>
>>> Do you find the for-else construct useful?
>> No.
>>
>>> Have you used it in practice?
>> Once or twice, but ended up removing it, see below.
>>
>>> Do you even know how it works, or that there is such a thing in Python?
>> I always have to look it up, because to my mind, "else" implies
>> it does something quite different from what it actually does.
>>
>> Which means that even if I worked hard at memorizing what it does,
>> so I didn't have to look it up, I still wouldn't use it in code,
>> because I want my code to be easily readable (including by future-me).
>> for..else makes code difficult to understand by anyone who doesn't
>> use for..else frequently: they might be misled into misunderstanding
>> the control flow.
>>
>>            ...Akkana
>>


Click here to read the complete article
1
server_pubkey.txt

rocksolid light 0.9.8
clearnet tor