我有以下代码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.Atags.Tags.A__getitem__在模块级别使用(仅适用于 Python 3.7)以下示例的类型提示应该是什么:
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?
另外,假设我有一个数据帧作为函数的输入变量。但我不希望在函数内部更改数据框。有什么方法可以为输入变量分配类型,以便我们可以确保该变量不会在函数内部更改?
我是 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) 我正在使用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)
谢谢你的帮助!
想象一下,我们有一些巨大的遗留代码库,其中有很多文件被忽略了 Mypy 警告:
\ndef foobar():\n x = some_external_class.some_method()[0] # type: ignore[ignore-some-mypy-warning]\nRun Code Online (Sandbox Code Playgroud)\n该走了...
\n代码的某些部分已更改。代码的某些部分仍然是相同的。如何检查每个“忽略”评论以了解:如果删除它,我会收到错误吗?
\n期望的输出:
\ndef foobar():\n x = some_external_class.some_method()[0] # type: ignore[ignore-some-mypy-warning]\nRun Code Online (Sandbox Code Playgroud)\n有没有现有的工具可以实现这一目标?关于自定义脚本有什么想法吗?
\n我唯一的想法是:
\n考虑:
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) 我想通过 [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)
有没有什么好的方法可以改善这个问题呢?
这似乎不起作用:
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。
我究竟做错了什么?
我想了解为什么float和np.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) 作为一个玩具示例,让我们使用斐波那契数列:
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-typing ×10
python ×8
mypy ×5
python-3.x ×2
type-hinting ×2
dataframe ×1
numpy ×1
pandas ×1
plotly ×1
pydantic ×1
pylint ×1
python-3.6 ×1