声明Python的外部类型(mypy)

时间:2018-10-30 08:40:59

标签: python mypy

我正在为带有嵌入式IronPython的工具编写Python脚本。此工具会将自己的许多变量注入IronPython全局范围,例如一个名为resources的函数。

编写脚本时,我遇到许多关于未定义变量的假阳性linter错误。

对于该工具定义的变量,是否有办法消除这些错误?

我正在寻找与打字稿定义文件(* .d.ts)等效的东西。我想告诉编辑器这些变量存在,并且(可选)它们的类型是什么,但不想初始化它们的值(因为这会覆盖工具提供的定义)。

我曾经想过要在脚本中初始化这些变量,以使它们仅在不存在时才进行初始化(因此在运行时不会覆盖工具的定义)。例如

if resources is None:
    resources = None  # type: (str) -> object

但这似乎不是最佳解决方案。

1 个答案:

答案 0 :(得分:1)

最终,您需要以一种或另一种形式对mypy撒谎-问题只是归结为一种符合人体工程学且方便的方式。

可能最方便的方法是在一个单独的文件中定义多余的内容,然后将它们全局导入到脚本中。您可以利用typing.TYPE_CHECKING变量来做到这一点,而不会实际污染环境-该变量在运行时始终为False,但在类型检查时被视为true。因此,您可能会执行以下操作:

from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from my_ironpython_globals import *

但是,最好确保没有人在运行时实际尝试使用自定义模块中的任何内容。确保这一点的一种方法是在stub file中定义所有其他变量/函数-存根文件是Python与TypeScript的定义文件的类似物。

简而言之,请在您的项目中创建一个扩展名为.pyi(而不是.py)的文件,然后在其中定义所有内容。

如果您想查看存根文件的外观示例,请尝试查看typeshed,这是标准库和一些流行的第三方库的存根的存储库。 (Mypy带有复制的副本)。如果您对这种东西感兴趣,他们的contribution guidelines会提供样式指南。

如果您希望将新创建的存根作为第3方模块分发,您可以点安装并使用它,请创建一个PEP 561-compliant package,其中包含您的类型提示。


您可以采用的另一种方法是使用自己的自定义版本的排版。也就是说,克隆或派生typeshed并修改stdlib/*/builtins.pyi文件,使它们包含特定于ironpython的全局变量。

然后,使用--custom-typeshed-dir标志调用mypy:例如做mypy --custom-typeshed-dir path/to/my/typeshed mycode

如果键入此标志序列很麻烦,请创建一个configuration file并在那里编码设置。

这种方法比第一种方法更具原则性,因为您正在教mypy合法地识别任何可用的全局变量。但是,必须维护自己的分页符+顺应上游的变化, 的工作量很大(这种碎片化方法可能并不理想)。

因此,如果您决定采用这种方法,那么首先应该对排字的问题跟踪程序进行讨论可能是值得的。总的来说,分拣的(和PEP 484生态系统)还很新,因此仍然有影响其生长方向的空间。