Is this a "gotcha" in Python?

DL Neil PythonList at DancesWithMice.info
Sat Apr 20 18:41:58 EDT 2019


On 21/04/19 8:16 AM, Chris Angelico wrote:
> On Sun, Apr 21, 2019 at 2:14 AM Dennis Lee Bieber <wlfraed at ix.netcom.com> wrote:
>>          Only use short (single character) names for items that only exist as
>> loop control, and are not rebound within the loop, nor used outside of the
>> scope of that loop (but can be reused in another subsequent loop
>> control)...
>>
>>>>> for l in range(50):
>> ...     print l,
>> ...
>> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
>> 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
> 
> Be aware that this is using an old form of Python syntax, not
> supported by current versions. To try this example in a modern version
> of Python, write it like this:
> 
> for l in range(50):
>      print(l, end=" ")


Python2: print l,

Python3: print( l )

Recommend using the latter, unless "this application" MUST use/import an 
externally-sourced module which has yet to be updated from Python2!


Regarding the choice of variable names/attaching meaning:-

Isn't there an argument that in this context, using the single letter 
"l" as a variable name is 'lazy'? That the "l" could be used in 
different contexts (per OP). That it conveys no meaning as to the 
variable's purpose?

Surely the variable actually has 'meaning'. Otherwise it wouldn't be 
used in the print statement/function! (appreciating this is a simple 
situation/'toy example')

That being the case, "l" should be something like "list_of_choices"?


There is an opposite case (and I'm somewhat diffident about it). Namely, 
using the underscore as a temporary variable. I have not seen it very 
often (YMMV). However, it seems to fit under the heading of 'a Pythonic 
convention'.

Remember that Python variable names may commence with a letter [pep3] or 
an underscore [lexi]. Variables commencing with an underscore are 
described as <<<2.3.2. Reserved classes of identifiers>>>.

PEP-8 [pep8] talks of <<<_single_leading_underscore: weak "internal use" 
indicator>>> because whilst there is a convention of 'private use' it is 
not enforced as a 'rule' - ie the "consenting adults" clause applies!

Thus, I have occasionally seen a sole underscore used as a variable 
name. The "weak internal use" seemingly: <<<I need a variable name 
'here', but I have no use for it.>>>


Example usage includes:

- accessing a tuple, but not being interested in every element, eg

 >>> t = ( 1, 2, 3 )
# We ignore the first element unpacked from the tuple
 >>> _, a, b = t
 >>> print( f'There are { a } of these and { b } of those' )
There are 2 of these and 3 of those
 >>> a
2
 >>> b
3
# We can ignore more than one element - but here be dragons!
 >>> _, c, _ = t
 >>> print( f'{ c } is the only value needed' )
2 is the only value needed
 >>> c
2
# We can even ascertain the (latest) value applied to the _ variable:
 >>> _
3
# See the need to watch for those dragons!

- ignoring the 'index' of a for-loop, eg

# Let's do a speed test against client requirements
for _ in range( 1000000 ):
     time_something()

- most usually I've seen the two combined:

# Ignore one element's value and process the other
for _, value in list_of_tuples:
     # use value but not _


Arguing that the "l" variable name conveys no meaning, or is 'just a 
counter', could one then modify the previous example:
 > for _ in range( 50 ):
 >      print( _, end=" " )
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 >>>


Would this provoke a discussion (or an argument) in your next code review?


-- 
Regards =dn

Web-refs:
[lexi] 
https://docs.python.org/3.6/reference/lexical_analysis.html#identifiers
[pep3] https://www.python.org/dev/peps/pep-3131/
[pep8] https://www.python.org/dev/peps/pep-0008/


More information about the Python-list mailing list