我正在使用yarl库的URL对象。
它有一个准私有属性._val,它是一个urllib.parse.SplitResult对象,但在yarl/__init__.pyi中没有类型注释。(这是可以理解的,如果开发人员不想正式将其作为公共API的一部分。)
然而,我选择使用URL._val是出于我自己的风险。一个虚拟的例子:
# 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不喜欢这样,因为它抱怨:
$ mypy urltest.py
"URL" has no attribute "_val"因此,在我自己的项目中,我如何“调整”(或扩展)一个实例属性注释到URL,以便它可以在我的项目的其余部分中使用?也就是说。
from yarl import URL
URL._val: SplitResult
# ...(mypy也不喜欢这样;“不能在赋值给非自我属性中声明类型”)。
更新
我尝试在stubs/yarl/__init__.pyi中创建一个新存根文件
from urllib.parse import SplitResult
class URL:
_val: SplitResult然后设置export MYPYPATH='.../stubs',如存根文件中所述。但是,这个覆盖(而不是扩展)现有的注释,所以除了._val之外,所有东西都抛出和出错:
错误:"URL“没有属性"with_scheme” 错误:"URL“没有属性"host” 错误:"URL“没有属性”片段“
...and等。
发布于 2019-09-17 13:43:45
一种可能是简单地忽略此分配的u类型:
def foo(u: URL) -> Tuple[str, str, str, str]:
sr: SplitResult = typing.cast(typing.Any, u)._val
return sr[:3]mypy将假设您知道自己在做什么,并且u有一个具有str类型的_val属性。
https://stackoverflow.com/questions/57975352
复制相似问题