首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展第三方库/模块的存根文件

扩展第三方库/模块的存根文件
EN

Stack Overflow用户
提问于 2019-09-17 13:30:07
回答 4查看 3.3K关注 0票数 7

我正在使用yarl库的URL对象。

它有一个准私有属性._val,它是一个urllib.parse.SplitResult对象,但在yarl/__init__.pyi中没有类型注释。(这是可以理解的,如果开发人员不想正式将其作为公共API的一部分。)

然而,我选择使用URL._val是出于我自己的风险。一个虚拟的例子:

代码语言:javascript
复制
# urltest.py
from urllib.parse import SplitResult
from typing import Tuple

from yarl import URL


def foo(u: URL) -> Tuple[str, str, str]:
    sr: SplitResult = u._val
    return sr[:3]

但是mypy不喜欢这样,因为它抱怨:

代码语言:javascript
复制
$ mypy urltest.py
"URL" has no attribute "_val"

因此,在我自己的项目中,我如何“调整”(或扩展)一个实例属性注释到URL,以便它可以在我的项目的其余部分中使用?也就是说。

代码语言:javascript
复制
from yarl import URL

URL._val: SplitResult
# ...

(mypy也不喜欢这样;“不能在赋值给非自我属性中声明类型”)。

更新

我尝试在stubs/yarl/__init__.pyi中创建一个新存根文件

代码语言:javascript
复制
from urllib.parse import SplitResult

class URL:
    _val: SplitResult

然后设置export MYPYPATH='.../stubs',如存根文件中所述。但是,这个覆盖(而不是扩展)现有的注释,所以除了._val之外,所有东西都抛出和出错:

错误:"URL“没有属性"with_scheme” 错误:"URL“没有属性"host” 错误:"URL“没有属性”片段“

...and等。

EN

Stack Overflow用户

发布于 2019-09-17 13:43:45

一种可能是简单地忽略此分配的u类型:

代码语言:javascript
复制
def foo(u: URL) -> Tuple[str, str, str, str]:
    sr: SplitResult = typing.cast(typing.Any, u)._val
    return sr[:3]

mypy将假设您知道自己在做什么,并且u有一个具有str类型的_val属性。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57975352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档