社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

为python(mypy)声明外部类型

James Elderfield • 5 年前 • 1304 次点击  

我正在为一个嵌入了Ironpython的工具编写python脚本。这个工具向Ironpython全局范围内注入许多它自己的变量,例如一个名为 resources

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

对于工具定义的变量,是否有抑制这些错误的方法?

我在找类似于typescript定义文件(*.d.ts)的东西。我想告诉编辑器这些变量存在,以及(可选)它们的类型,但不想初始化它们的值(因为这样会覆盖工具提供的定义)。

有一种想法是,我可以选择在脚本中初始化这些变量,这样它们只有在不存在时才被初始化(这样在运行时就不会覆盖工具的定义)。例如

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38498
 
1304 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Michael0x2a
Reply   •   1 楼
Michael0x2a    6 年前

一天结束的时候,你需要以一种或另一种形式对Mypy撒谎——问题的归根结底就是这样做的符合人体工程学和方便的方式是什么。

这样做最方便的方法可能是在单独的文件中定义额外的文件,并将它们全局导入到脚本中。你可以利用 typing.TYPE_CHECKING variable——该变量在运行时始终为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 如果你对这类东西感兴趣的话,有一个风格指南。

如果要将新创建的存根作为第三方模块分发,只需pip安装和使用,请创建一个 PEP 561-compliant package 包含类型提示。


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

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

如果键入此标志序列变得单调乏味,请创建一个 configuration file 在那里编码你的设置。

这种方法比第一种方法更具原则性,因为你教mypy合法地识别任何可用的全局变量。但是,必须维护自己的typeshed叉+跟上上游的变化 很多工作(这种碎片化可能不理想)。

因此,如果您确实决定采用这种方法,那么首先应该讨论一下typeshed的问题跟踪程序。排版(以及PEP484生态系统)总体上还是相当新的,所以仍然有空间影响它的生长方向。