Shadowing built-ins [was Re: filter a list of strings]
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Wed Dec 9 02:38:08 EST 2015
On Wednesday 09 December 2015 09:58, Thomas 'PointedEars' Lahn wrote:
> Mark Lawrence wrote:
>
>> On 03/12/2015 01:15, c.buhtz at posteo.jp wrote:
>>> I would like to know how this could be done more elegant/pythonic.
>>>
>>> I have a big list (over 10.000 items) with strings (each 100 to 300
>>> chars long) and want to filter them.
>>>
>>> list = .....
>>> […]
[...]
> However, “list” is a built-in class/constructor that would be overwritten
> this way. One should choose another identifier than “list” for one’s
> variables.
Correct, well mostly correct.
The original built-in list is *not* overridden, as such, but shadowed: it
still exists, but access to it is blocked by the local variable "list". The
list *type* still exists, only the *name* list is shadowed. So you can
easily recover from accidentally shadowing the name by deleting the local:
del list
To beginners, accidental shadowing of built-ins is a serious source of
confusion. But to experts, intentional shadowing can be useful.
There's nothing wrong with (say):
def sort_and_pop(list):
list.sort()
list.pop(0)
Yes, the local "list" shadows the built-in list. So what?
More usefully, one can monkey-patch a module by shadowing a built-in in that
module:
# Python 3 only.
import builtins
def print(*args, **kwargs):
log_something()
builtins.print(*args, **kwargs)
--
Steve
More information about the Python-list
mailing list