learning python ...
Cameron Simpson
cs at cskk.id.au
Sun May 23 18:03:24 EDT 2021
On 23May2021 21:02, Stestagg <stestagg at gmail.com> wrote:
>On Sun, 23 May 2021 at 20:37, hw <hw at adminart.net> wrote:
>> I don't know about shadowing.
>
>Shadowing is effectively saying “within this bit of code, (scope) I’m going
>to use an already-used name for my own value”
An example might make this clearer:
x = 1 # global variable
def f(a):
x = a * 2
return x
Inside the function f() the name 'x" shadows the global "x"; references
to "x" are to the function's local vairable. Which is very desireable.
>If I have defeated a whole variable type
>> by naming a variable like a variable type, I would think it is a bad
>> idea for python to allow this without warning.
>
>There are some reasons why allowing this is quite nice. And there’s
>actually a ton of corner cases to consider when thinking about changing the
>rules
As Stestagg has mentioned, there are also tools called linters which
warn you about issues like this. Tools like pyflakes, pylint,
pycodestyle all inspect your code for a wide variety of potential errors
and discouraged habits. Not to mention tools like mypy which do type
validation.
>Interestingly python 3 made this a little bit better by stopping you from
>rebinding (shadowing) a number of built ins, such as True and False.
>
>In your case, I agree that it is super confusing. One thing to learn to
>look out for is if you assign to a name, then use that name on a different
>context, expecting it to be different, then that’s not likely to work as
>you expect.
>
>It seems like a recipie
>> for creating chaos.
The runtime lets you do all sorts of things. Linters and type checkers
exist to help you notice if you're writing such a recipe.
There _are_ times when it is useful to shadow a builtin name. Not being
able to prevents a useful activity.
A common example in my own code is this:
from cs.upd import Upd, print
which shadows the print() builtin. The Upd class maintains status lines
such as progress bars and so forth. It provides a print() function which
withdraws the status lines, runs the builtin print, then restores them,
allowing normal idiomatic use of print() in scripts making use of the
status lines.
Similar situations abound.
Cheers,
Cameron Simpson <cs at cskk.id.au>
More information about the Python-list
mailing list