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.
“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.
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)
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With