Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shadows built-in names "function" and "module" with PyCharm

Tags:

python

pycharm

I have the following Python code:

function = "Developer"
module = "something"
print(function + " on " + module)

With PyCharm 2017, I have a bubble which says “Shadows built-in names "function"/"module" with PyCharm”.

I’m surprised because "function" and "module" are not built-in names. They are not keywords either:

import __builtin__
import keyword

assert "function" not in dir(__builtin__)  # -> OK
assert "module" not in dir(__builtin__)    # -> OK
assert "function" not in keyword.kwlist    # -> OK
assert "module" not in keyword.kwlist      # -> OK

What’s wrong?

I’m using CPython 2.7, but have the same trouble with 3.5 & 3.6.

EDIT:

__builtin__ is now builtins in Python 3.

like image 646
Laurent LAPORTE Avatar asked Jul 20 '17 12:07

Laurent LAPORTE


People also ask

What does shadows built in name mean in Python?

“What is shadows built in name?” Code Answer # You started a variable with the name that was used in the standard library. Now that library object is not available to you.

What is shadow in Python?

The shadow() function is an inbuilt function in the Python Wand ImageMagick library which is used to generates an image shadow. Syntax: shadow(alpha, sigma, x, y)

What does outer scope mean?

The scope contained within another scope is named inner scope. In the example, if code block scope is an inner scope of run() function scope. The scope that wraps another scope is named outer scope. In the example, run() function scope is an outer scope to if code block scope.


2 Answers

function is "defined" in builtins.pyi:

class function:
    # TODO not defined in builtins!   
    __name__ = ...  # type: str
    __qualname__ = ...  # type: str
    __module__ = ...  # type: str
    __code__ = ...  # type: Any
    __annotations__ = ...  # type: Dict[str, Any] 

Keep in mind I used "defined" vs defined. Check out this absurdity:

foo = function

raises

Traceback (most recent call last):
  File "main.py", line 117, in <module>
    foo = function
NameError: name 'function' is not defined

Yet if you do function = 'a' the IDE will complain (as you noticed) that this shadows a built-in name (even though function is clearly not actually defined).

The exact behavior repeats with module.

This is because (as far as I understand, anyone please correct me if I'm wrong) pyi files are only there to provide type hints (as PEP-484 suggests).

So, I'm not sure if this warning is a bug in Pycharm's linter (perhaps it should not be looking at "definitions" in .pyi files) or an intended behavior.

Either way, module and function are probably not good variable names anyway.

like image 104
DeepSpace Avatar answered Sep 17 '22 11:09

DeepSpace


Per PY-8672, since March 2014 there is an ability to ignore certain names with this inspection. Open Settings, search "Shadowing built-ins", click on the inspection name, and use the Options section to add names the inspection should whitelist.

like image 35
theY4Kman Avatar answered Sep 20 '22 11:09

theY4Kman