标签: mypy

使用Python输入模块指定Sequence或List的长度

我正在给Python typing模块一个镜头.

我知道指定List以下*的长度是有效的:

List[float, float, float]   # List of 3 floats <-- NOTE: this is not valid Python
Run Code Online (Sandbox Code Playgroud)

是否有更长的名单的简写?如果我想将它设置为10个花车怎么办?

List[float * 10]   # This doesn't work.
Run Code Online (Sandbox Code Playgroud)

如果这是可能的,任何想法,这将是方便的.


*注意:事实证明Sequence[]以这种方式向(及其子类)提供多个参数当前不是有效的Python.此外,目前不可能以这种方式Sequence使用typing模块指定长度.

python type-hinting python-3.x mypy

15
推荐指数
4
解决办法
4423
查看次数

如何使用 AsyncGenerator 和 AsyncContextManager 正确指定类型提示

考虑下面的代码

import contextlib
import abc
import asyncio

from typing import AsyncContextManager, AsyncGenerator, AsyncIterator


class Base:

    @abc.abstractmethod
    async def subscribe(self) -> AsyncContextManager[AsyncGenerator[int, None]]:
        pass

class Impl1(Base):

    @contextlib.asynccontextmanager
    async def subscribe(self) ->  AsyncIterator[ AsyncGenerator[int, None] ]: <-- mypy error here

        async def _generator():
            for i in range(5):
                await asyncio.sleep(1)
                yield i
                    
        yield _generator()
Run Code Online (Sandbox Code Playgroud)

对于Impl1.subscribemypy 给出错误

Signature of "subscribe" incompatible with supertype "Base"
Run Code Online (Sandbox Code Playgroud)

在上述情况下指定类型提示的正确方法是什么?或者 mypy 这里错了?

python type-hinting mypy

15
推荐指数
1
解决办法
1万
查看次数

mypy 在导入子模块时出错:模块没有属性

当我通过 mypy 检查模块时,出现以下错误:

模块“django.contrib.gis”没有属性“forms”

我正在导入这样的表格:

from django.contrib.gis import forms
Run Code Online (Sandbox Code Playgroud)

我知道这是正确的,但 mypy 显示此错误消息。

我可以像这样导入: from django.contrib import gis并使用formsasgis.forms但我不想这样做。

谁能帮我解决这个问题吗?谢谢。

python django mypy

14
推荐指数
1
解决办法
1万
查看次数

Mypy:我应该如何输入一个以字符串为键且值可以是字符串或字符串列表的字典?

我正在使用 Python 3.8.1 和 mypy 0.782。我不明白为什么 mypy 会抱怨以下代码:

from typing import Union, List, Dict
Mytype = Union[Dict[str, str], Dict[str, List[str]]]
s: Mytype = {"x": "y", "a": ["b"]}
Run Code Online (Sandbox Code Playgroud)

Mypy 在第 3 行给出以下错误:

Incompatible types in assignment (expression has type "Dict[str, Sequence[str]]", variable has type "Union[Dict[str, str], Dict[str, List[str]]]")
Run Code Online (Sandbox Code Playgroud)

如果我将最后一行更改为s: Mytype = {"a": ["b"]}mypy 不会抱怨。但是,当再添加一行时s["a"].append("c")会导致错误:

error: Item "str" of "Union[str, List[str]]" has no attribute "append"
Run Code Online (Sandbox Code Playgroud)

上述情况该如何解释呢?我应该如何输入一个以字符串为键且值可以是字符串或字符串列表的字典?

发现这个: https: //github.com/python/mypy/issues/2984#issuecomment-285716826但仍然不完全确定为什么会发生上述情况以及我应该如何修复它。

编辑: 虽然还不清楚为什么建议的修改Mytype = Dict[str, Union[str, List[str]]]不能解决错误,但 …

python python-3.x mypy

14
推荐指数
1
解决办法
3万
查看次数

如何在 Python 中的泛型类型上使用 isinstance

我试图检查参数是否是类声明中指定的泛型类型的实例。然而Python似乎不允许这样做。

T = TypeVar('T')
class MyTypeChecker(Generic[T]):
    def is_right_type(self, x: Any):
        return isinstance(x, T)
Run Code Online (Sandbox Code Playgroud)

这给出了错误'T' is a type variable and only valid in type context

python mypy

14
推荐指数
1
解决办法
9781
查看次数

Pandas的Mypy/typeshed存根

只是检查是否有人正在监听已经为Pandas生成了一组工作的mypy/typeshed存根.我天真地在本地Pandas安装上运行stubgen,这会产生一些错误.我可以继续我的开始,但希望其他人进一步推动球.(在GitHub上没有明显的东西,尽管有一个旧的存根票.)

python numpy type-hinting pandas mypy

13
推荐指数
4
解决办法
2518
查看次数

为了类型检查而将NamedTuple子类化的方法

我有几个分享一些字段的命名元组.我有一个接受这些元组的函数,并保证只与共享字段交互.我想在mypy中检查这样的代码.

代码的一个例子是:

from typing import NamedTuple

class Base(NamedTuple):
    x: int
    y: int


class BaseExtended(NamedTuple):
    x: int
    y: int
    z: str

def DoSomething(tuple: Base):
    return tuple.x + tuple.y

base = Base(3, 4)
base_extended = BaseExtended(5, 6, 'foo')

DoSomething(base)
DoSomething(base_extended)
Run Code Online (Sandbox Code Playgroud)

当我在这段代码上运行mypy时,我得到一个可预测的错误:

mypy_example.py:20:错误:"DoSomething"的参数1具有不兼容的类型"BaseExtended"; 预期"基地"

有没有办法构建我的代码并保持mypy typechecking?我不能从Base继承BaseExtended,因为NamedTuple继承实现中存在一个错误:

https://github.com/python/typing/issues/427

我也不想使用一个丑陋的"Union [Base,BaseExtended]",因为当我尝试对一个List进行类型检查时会出现这种情况,因为"List [Union [Base,BaseExtended]]"不等于"List [BaseExtended] ]"由于关于变体/协变类型的一些mypy魔术:

https://github.com/python/mypy/issues/3351

我应该放弃这个想法吗?

python typing namedtuple mypy

13
推荐指数
1
解决办法
2367
查看次数

SQLAlchemy 引擎和会话对象的类型提示

我正在尝试向我的 SQLAlchemy 脚本添加类型提示:

connection_string: str = "sqlite:///:memory:"
engine = create_engine(connection_string)
session = Session(bind=engine)
reveal_type(engine)
reveal_type(session)
Run Code Online (Sandbox Code Playgroud)

我已经运行了这个脚本,mypy但两种类型都作为Any. enginesession变量应该是什么类型?

python sqlalchemy type-hinting mypy

13
推荐指数
1
解决办法
4929
查看次数

初始化 TypedDict 并稍后填充键和值

我有一个字典,其中键和值的类型是固定的。我想定义 a 中的类型TypedDict如下:

class MyTable(TypedDict):
    caption: List[str]
    header: List[str]
    table: pd.DataFrame
    epilogue: List[str]
Run Code Online (Sandbox Code Playgroud)

我有返回一个MyTable. 我想首先定义一个空(Typed)dict并填充键和值。

def returnsMyTable():
    result = {}
    result['caption'] = ['caption line 1','caption line 2']
    result['header'] = ['header line 1','header line 2']
    result['table'] = pd.DataFrame()
    result['epilogue'] = ['epilogue line 1','epilogue line 2']
    return result
Run Code Online (Sandbox Code Playgroud)

这里 MyPy 抱怨需要结果的类型注释。我尝试了这个:

result: MyTable = {}
Run Code Online (Sandbox Code Playgroud)

但随后 MyPy 抱怨密钥丢失了。同样,如果我定义键但将值设置为None,它会抱怨值的类型不正确。

是否可以先将 a 初始化TypedDict为空 Dict,然后再填充键和值?文档似乎表明是这样

我想我可以首先将值定义为变量,然后MyTable再组装它们,但我正在处理要添加类型提示的遗留代码。所以我想尽量减少工作量。

python mypy typeddict

13
推荐指数
1
解决办法
2万
查看次数

Python 打字:TypedDict 是否允许附加/额外的键?

是否typing.TypedDict允许额外的钥匙?如果某个值具有 TypedDict 定义中不存在的键,该值是否会通过类型检查器?

python mypy python-typing

13
推荐指数
1
解决办法
5828
查看次数