我有以下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
。
答案 0 :(得分:8)
function
在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]
请记住,我使用了“已定义”和“已定义”。看看这个荒谬:
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月起,可以通过此检查忽略某些名称。打开“设置”,搜索“隐藏内置插件”,单击检查名称,然后使用“选项”部分添加检查应列入白名单的名称。