问题标签 [typeshed]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
695 浏览

python - 添加类型信息而不依赖于类型模块

我一直在向我的包.py文件添加类型信息,以支持mypy针对包运行。除其他外,还允许为此第三方包生成类型信息。

由于我的包必须与 Python 2.7 兼容,因此我对类型信息使用注释:

但为了运行mypy这需要我导入输入:

这会导致两个问题:

  1. 这不适用于 Python 3.5.0 和 3.5.1,因为它有一个模块typing,但不包括Text. 从 PyPI安装typing并不能解决这个问题。(并且有些用户在该版本的 Python 上运行该包)。

  2. 这使我的包依赖于typing2.7/3.3/3.4 安装,需要额外的下载和安装。

  3. Union定义了自己的类型:

    必须根据输入是否可用,有条件地执行此代码。

对于第一个问题,由于我不在mypyPython 3.5.0/1 下运行,我可以执行以下操作:

但这并不能解决第二个问题。

注释掉import,例如注释中的类型信息,

会导致mypy抛出错误Name 'Text' is not defined

第三个问题可以通过使用try- except(丑陋,而且可能效率低下)或例如通过测试环境变量(也可以用来解决第一个问题)来解决。

运行时是否设置了环境变量mypy,我可以对其进行测试,以便仅在运行时执行导入语句mypy?针对环境变量进行测试还可以让我将自己类型的定义放在“受保护的”范围内。

还是其他解决方案?

0 投票
0 回答
404 浏览

python - 本地修补缺少的 Python 类型注释?

Python 现在支持类型提示,所以...耶!这似乎是避免一些更晦涩的运行时错误的好方法。

可悲的是,第三方库支持仍然是一个问题。虽然 mypy 也使用了 typeshed 项目部分解决了这个问题尝试移植我的一些代码以使用类型提示时,由于缺少存根,我遇到了问题。

例如

会很好地工作,但 mypy 会产生虚假的错误消息

因为存根当前不完整。

对于一个更大的项目,从 typeshed 下载存根,添加缺失的条目,甚至提交相应的拉取请求是一件轻而易举的事。

但是有什么方法可以在快速而肮脏的场景中修补缺失的信息吗?

糟糕的解决方法

我能想到的最好的是

这可以消除错误,但也会禁用items之后使用变量的类型检查。例如items[0] + 1,不会再引起警告。

为了保留类型检查,可以使用

但这似乎很老套;它还必须在.xpath使用该方法的任何地方重复。

从 2017-09-12 更新:或者可以使用语法

0 投票
1 回答
84 浏览

python - 通过比较 python stubs 文件查找接口变化

我正在尝试确定 python 包的公共部分到以前版本的接口更改。这是为了帮助进行语义版本控制 (MAJOR_CHANGE.MINOR_CHANGE.PATCH) 我能想到的最佳方法如下:

  1. 为新版本的包生成存根文件(您可以使用stubgen执行此操作。这为您提供了整个包、子包和模块的公共接口......
  2. 比较包的新旧版本的存根。
    • 如果没有接口变化,那么新版本只会对 PATCH 号 +1
    • 如果原始界面保持不变,但添加了全新的功能(或属性),这将是一个微小的变化,所以 +1 到 MINOR
    • 如果原始界面的任何部分发生更改,这将是一个重大的破坏性更改,因此 +1 到 MAJOR

所以基本上,问题是,为这些更改比较 2 个存根文件包的最佳方法是什么?我们可以比较 AST 文件,尽管这些文件不包含类型信息(我们可以尝试使用它来绕过那个https://github.com/python/typed_ast

示例存根文件在这里:

编辑:

为了更加清楚(并使用精美的图表!),我希望比较 2 个包 A 和 B 之间的公共接口。使用类型信息生成公共接口的最佳方法是使用stubgen。因此,包的公共接口将由一个.pyi文件包定义。

然后我们使用一个新的魔法工具(称为类似 snappy 的工具interface-diff)来比较 A 和 B 的两个接口。在最高级别比较接口时,我们将有 4 个潜在结果。

1) MAJOR - 从 A 中删除的东西,而不是添加到 B 的东西

在此处输入图像描述

2) MAJOR - 从 A 中删除的东西和添加到 B 的东西

在此处输入图像描述

3) 次要 - 添加到 B 而未从 A 中删除的东西

在此处输入图像描述

4) 补丁 - A == B

在此处输入图像描述

如果有人能把我放在正确的地方,我很高兴自己写这个:)

0 投票
1 回答
2837 浏览

python - 如何为已编译的 Python 扩展生成 .pyi 文件?

.pyd用 C++ 和pybind11. 我想.pyi为我的文件生成一个 Python 接口.pyd文件。

有一些类似的问题涉及到该mypy stubgen模块,但是,这会产生一个UnicodeError尝试运行stubgen Dummywhere Dummyis Dummy.pydfile:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x90 in position 2: invalid start byte

另一个项目make-stub-files根本无法处理.pyd文件,从而产生('not a python file'错误。

是否有任何工具可以让我从源.cpp文件或编译文件生成 .pyi.pyd文件?

该问题已在mypyGitHub 存储库中注册。

0 投票
1 回答
394 浏览

python - 你如何检查一个 typeshed stub (.pyi) 文件是否与实现匹配?

您可以使用 mypystubgen.py或其他一些工具自动生成.pyi文件,但 stubgen 包含额外的建议来检查存根文件的准确性。

如果我自动生成存根然后对其进行修改以修复错误或使生成器没有处理的更严格,那么我如何检查它们是否同意实现?或者随着实施的变化并且我有手动生成的文件,我怎样才能确保它们保持同步?

0 投票
1 回答
63 浏览

python-3.x - mypy (typeshed) 拒绝 csv.excel 作为返回 csv.Sniffer.sniff 的可能值

使用 mypy 静态检查我的一些代码并遇到此问题。代码示例:

但是 mypy 在第一次分配时给出了这个错误d

所以解决这个问题的自然方法是更改​​变量的类型。

但是现在我在对 d 的第二次分配中得到了这个错误:

但这很奇怪,因为csv.excel它是函数的有效返回,sniff所以它们肯定具有相同的类型。

Python 3.7.3,mypy 0.701

0 投票
0 回答
543 浏览

python - mypy django rest 框架 - 使用多个权限类时不支持的左操作数类型

我正在将 mypy 集成到现有代码库中(使用 django、drf 框架)。

view.py 中的示例代码:

结果:

使用的插件:

mypy 配置文件(mypy.ini):

用 mypy(0.720 和 0.740)检查。

这里可能是什么问题?由于操作'|' mypy 无法识别,我怀疑在 mypy 评估期间未添加元类 BasePermissionMetaclass(包含操作)。我假设只需安装 djangorestframework-stubs 并在 mypy.ini 中配置它就足够了。

0 投票
1 回答
126 浏览

python - 将 TypeVar 上限设置为之后定义的类

我正在查看typeshed源代码,发现pathlib.pyi它执行以下操作:

我有一个类似的情况,基类从__new__(类似于Path)返回一个子类,因此类型注释也相似。但是,将bound关键字定义为下面定义的类会解析为NameError,因为名称尚未解析(正如我所预料的那样;由于typeshed来源而尝试)。

如何typeshed摆脱这个?这对我的打字来说是完美的,否则我必须这样做:

并且我所有的 linter 警告都满足("expected type _MT, got object instead")...

更好的匹配案例是输入工厂方法,因为我使用__new__的工厂方法类似于Path它的方式和描述here。不过,很高兴知道如何在不使用字符串的情况下typeshed完成此前向引用。bound

0 投票
0 回答
513 浏览

python - mypy 错误:模块没有属性“__path__”

我正在尝试正确注释在 python 包上运行的函数中的类型。根据经验,我知道一个包有__path__属性。在运行时,包(带有 的文件夹__init__.py)和模块(.py 文件)的类型<class 'module'>都是types.ModuleType; 但是模块没有__path__属性。

使用内置的演示:

包的类型是什么以及如何注释它?

示例代码:

使用 mypy 检查失败error: Module has no attribute "__path__"。我应该使用哪种类型来表示只有包而不是模块应该传递给我的函数?