使用PyCharm阴影内置名称“function”和“module”

时间:2017-07-20 12:26:20

标签: python pycharm

我有以下Python代码:

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

使用PyCharm 2017,我有一个泡泡,上面写着“Shadows内置名称”功能“/”模块“与PyCharm”。

我很惊讶因为“功能”和“模块”不是内置名称。它们也不是关键字:

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

怎么了?

我正在使用CPython 2.7,但在3.5& 3.6。

修改

Python中的

__builtin__现在是builtins

2 个答案:

答案 0 :(得分:8)

functionbuiltins.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] 

请记住,我使用了“已定义”和“已定义”。看看这个荒谬:

foo = function

加注

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

然而,如果你做function = 'a',IDE会抱怨(如你所注意到的)这会影响内置名称(即使function显然不是实际定义的)

确切的行为以module重复。

这是因为(据我所知,如果我错了,请任何人纠正我)pyi文件只提供类型提示(如PEP-484 suggests)。

所以,我不确定这个警告是否是Pycharm的linter中的错误(可能不应该查看.pyi文件中的“定义”)或预期的行为。

无论如何,无论如何,模块功能可能都不是好的变量名。

答案 1 :(得分:2)

Per PY-8672,自2014年3月起,可以通过此检查忽略某些名称。打开“设置”,搜索“隐藏内置插件”,单击检查名称,然后使用“选项”部分添加检查应列入白名单的名称。