【问题标题】:Shadows built-in names "function" and "module" with PyCharm阴影内置名称“函数”和“模块”与 PyCharm
【发布时间】:2017-07-20 12:26:19
【问题描述】:

我有以下 Python 代码:

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

在 PyCharm 2017 中,我有一个气泡,上面写着“使用 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 时遇到了同样的问题。

编辑:

__builtin__ 现在在 Python 3 中为 builtins

【问题讨论】:

    标签: python pycharm


    【解决方案1】:

    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 文件中的“定义”)还是预期的行为。

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

    【讨论】:

    • 我还是不明白为什么 PyCharm 存根中存在“函数”……
    • @LaurentLAPORTE 您需要询问 JetBrains,但就像我在回答中解释的那样,它很可能以某种方式协助类型提示。
    • 我在 GitHub 上找到了 Typeshed 参考。引用:“每个 Python 模块都由一个.pyi“存根”表示。这是一个普通的 Python 文件(即它可以被 Python 3 解释),除了所有的方法都是空的。 Python 函数注解 (PEP 3107) 用于描述函数具有的类型。”
    • 目前,我得到的最佳答案是:这是一件历史文物。可能它会在某个时候被删除,问题是这将需要在mypy 代码中进行大量微小的繁琐更改。
    【解决方案2】:

    根据PY-8672,自 2014 年 3 月以来,可以通过此检查忽略某些名称。打开设置,搜索“Shadowing built-ins”,点击检查名称,然后使用选项部分添加检查应列入白名单的名称。

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 2023-02-06
      • 2019-07-15
      • 1970-01-01
      • 2011-07-17
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多