标签: python-typing

动态属性设置时绕过 mypy 的“模块没有属性”

我有以下代码a.py

class Tags(enum.Flag):
    NONE = 0

    A = enum.auto()
    B = enum.auto()
    C = enum.auto()

# Allow using tags.A instead of tags.Tags.A
globals().update(Tags.__members__)
Run Code Online (Sandbox Code Playgroud)

但是当我在其他文件上使用它时, mypy (正确地)无法识别属性:

import tags
print(tags.A)  # Module has no attribute "A"
Run Code Online (Sandbox Code Playgroud)

Python 3.6 有没有可能绕过这个问题?

已知的解决方案(对于我的情况来说不够好):

  • # type: ignore每次使用时都使用tags.A
  • 使用tags.Tags.A
  • __getitem__在模块级别使用(仅适用于 Python 3.7)

python python-3.x python-3.6 mypy python-typing

7
推荐指数
1
解决办法
6422
查看次数

python3中plotly对象的typehint是什么

以下示例的类型提示应该是什么:

import plotly.graph_objs as go

def update_scene_callback():
   ....

def scatter_plot(input_data, layout):
    fig = go.FigureWidget(input_data)
    fig.update_layout(object_layout)
    scatter = fig.data[0]
    
    scatter.on_click(update_scene_callback)
    return fig
Run Code Online (Sandbox Code Playgroud)

type(fig)函数plotly.graph_objs._figurewidget.FigureWidget 的输入和输出的类型应该是什么scatter_plot

另外,假设我有一个数据帧作为函数的输入变量。但我不希望在函数内部更改数据框。有什么方法可以为输入变量分配类型,以便我们可以确保该变量不会在函数内部更改?

plotly python-typing

7
推荐指数
0
解决办法
923
查看次数

Python mypy:float和int是与numbers.Real不兼容的类型

我是 Python 静态类型模块的新手mypy。我试图将整数和浮点数附加到一个数组中,我静态地将其输入为 Real。但mypy说它们是与 Real 不兼容的类型。我认为整数和浮点数是实数的子类型?

from typing import List
from numbers import Real

data : List[Real] = []
with open(path, 'r') as file:
    for line in file:
        line = line.strip()
        if subject == 'time':
            data.append(float(line))
        else:
            data.append(int(line))
Run Code Online (Sandbox Code Playgroud)

错误信息:

from typing import List
from numbers import Real

data : List[Real] = []
with open(path, 'r') as file:
    for line in file:
        line = line.strip()
        if subject == 'time':
            data.append(float(line))
        else:
            data.append(int(line))
Run Code Online (Sandbox Code Playgroud)

python type-hinting mypy python-typing

7
推荐指数
1
解决办法
1678
查看次数

使用 Pandas 数据框作为 Pydantic 中的类型

我正在使用pydantic并想要创建包含 pandas 数据帧的类。我在网上找了很长一段时间,但没有找到任何东西。我的自定义类型代码如下所示。我将数据帧的类型命名为 pd.DataFrame 但显然它不正确。有谁知道如何声明 pandas 数据框类型?

import pandas as pd
from pydantic import BaseModel


class SubModelInput(BaseModel):
    a: pd.DataFrame
    b: pd.DataFrame

class ModelInput(BaseModel):
    SubModelInput: SubModelInput
    a: pd.DataFrame
    b: pd.DataFrame
    c: pd.DataFrame

Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

python dataframe pandas python-typing pydantic

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

如何检查 Mypy `# type:ignore` 注释是否仍然有效且必需?

想象一下,我们有一些巨大的遗留代码库,其中有很多文件被忽略了 Mypy 警告:

\n
def foobar():\n    x = some_external_class.some_method()[0]  # type: ignore[ignore-some-mypy-warning]\n
Run Code Online (Sandbox Code Playgroud)\n

该走了...

\n

代码的某些部分已更改。代码的某些部分仍然是相同的。如何检查每个“忽略”评论以了解:如果删除它,我会收到错误吗?

\n

期望的输出:

\n
def foobar():\n    x = some_external_class.some_method()[0]  # type: ignore[ignore-some-mypy-warning]\n
Run Code Online (Sandbox Code Playgroud)\n

有没有现有的工具可以实现这一目标?关于自定义脚本有什么想法吗?

\n

我唯一的想法是:

\n
    \n
  1. 编写一个脚本来查找并记住一个文件和每条 Mypy 注释的一行。
  2. \n
  3. 查找并删除所有Mypy 评论。
  4. \n
  5. 运行 Mypy 检查 \xe2\x86\x92 存储结果。
  6. \n
  7. 将 Mypy 检查错误行与存储的行进行比较。
  8. \n
  9. 查找差异:如果注释被删除,但 Mypy 现在不抱怨该行,则必须删除注释。
  10. \n
\n

python python-3.x mypy python-typing

7
推荐指数
1
解决办法
8662
查看次数

Python 子类实例的输入签名?

考虑:

from __future__ import annotations

class A:
    @classmethod
    def get(cls) -> A:
        return cls()

class B(A):
    pass

def func() -> B: # Line 12
    return B.get()
Run Code Online (Sandbox Code Playgroud)

运行 mypy 我们得到:

$ mypy test.py
test.py:12: error: Incompatible return value type (got "A", expected "B")
Found 1 error in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)

此外,我还检查了旧式递归注释是否有效。那是:

$ mypy test.py
test.py:12: error: Incompatible return value type (got "A", expected "B")
Found 1 error in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)

...没有用。

当然可以这样做:

# from …
Run Code Online (Sandbox Code Playgroud)

python mypy python-typing

7
推荐指数
1
解决办法
955
查看次数

如何为 argparse 参数提供类型提示?

我想通过 [PyFlakes, Pylint] 和 mypy 获得正确的 linting 和类型提示。

例如,在下面的代码中,我们无法得到最后一行的类型错误。我们甚至不知道是否float_input存在。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--float_input', type=float)
args = parser.parse_args()


def int_sum(a: int, b: int):
    return a + b

c = int_sum(args.float_input, args.float_input)
Run Code Online (Sandbox Code Playgroud)

有没有什么好的方法可以改善这个问题呢?

python pylint type-hinting mypy python-typing

7
推荐指数
1
解决办法
2775
查看次数

为什么 Python NewType 与 isinstance 和 type 不兼容?

这似乎不起作用:

from typing import NewType

MyStr = NewType("MyStr", str)
x = MyStr("Hello World")

isinstance(x, MyStr)
Run Code Online (Sandbox Code Playgroud)

我什至不明白False,但TypeError: isinstance() arg 2 must be a type or tuple of types因为MyStr是一个函数并且isinstance需要一个或多个type

甚至assert type(x) == MyStr失败is MyStr

我究竟做错了什么?

python-typing

7
推荐指数
1
解决办法
1442
查看次数

使用类型联合时“arg-type”键入错误,单独使用类型时没有错误

我想了解为什么floatnp.float64类型的联合会在这里产生[arg-type]键入错误,但单独使用类型就可以了:

import numpy as np
from numpy.typing import ArrayLike
from typing import Any, Union


def as_float_array(a: ArrayLike) -> Any:
    ...


w: float = float(4)
as_float_array([w])

x: np.float64 = np.float64(4)
as_float_array([x])

y: Union[float, np.float64] = float(4)
as_float_array([y])

z: Union[float, np.float64] = np.float64(4)
as_float_array([z])

Run Code Online (Sandbox Code Playgroud)
/.../scratch.py:17: error: Argument 1 to "as_float_array" has incompatible type "List[Union[float, floating[_64Bit]]]"; expected "Union[Sequence[Sequence[Sequence[Sequence[Sequence[Any]]]]], Union[Union[_SupportsArray[dtype[Any]], Sequence[_SupportsArray[dtype[Any]]], Sequence[Sequence[_SupportsArray[dtype[Any]]]], Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]], Sequence[Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]]]], Union[bool, int, float, complex, str, bytes, Sequence[Union[bool, int, float, complex, str, bytes]], Sequence[Sequence[Union[bool, int, …
Run Code Online (Sandbox Code Playgroud)

python numpy python-typing

7
推荐指数
0
解决办法
757
查看次数

我们应该如何输入具有附加属性的可调用对象?

作为一个玩具示例,让我们使用斐波那契数列:

def fib(n: int) -> int:
  if n < 2:
    return 1
  return fib(n - 2) + fib(n - 1)
Run Code Online (Sandbox Code Playgroud)

当然,如果我们尝试执行以下操作,计算机将会挂起:

print(fib(100))
Run Code Online (Sandbox Code Playgroud)

所以我们决定添加记忆功能。为了保持逻辑fib清晰,我们决定不改变fib,而是通过装饰器添加记忆:

from typing import Callable
from functools import wraps


def remember(f: Callable[[int], int]) -> Callable[[int], int]:
    @wraps(f)
    def wrapper(n: int) -> int:
        if n not in wrapper.memory:
            wrapper.memory[n] = f(n)
        return wrapper.memory[n]

    wrapper.memory = dict[int, int]()
    return wrapper


@remember
def fib(n: int) -> int:
    if n < 2:
        return 1
    return fib(n - 2) …
Run Code Online (Sandbox Code Playgroud)

python python-typing

7
推荐指数
1
解决办法
744
查看次数