gpt4 book ai didi

python - 将 mypy 与实例属性的延迟初始化一起使用

转载 作者:行者123 更新时间:2023-12-03 23:08:13 24 4
gpt4 key购买 nike

更新 : 试图检查/填充另一个函数中的值

我正在尝试在我的项目中使用 mypy,但是我使用的许多实例属性仅在 __init__ 之后才初始化,而不是里面。但是,我确实希望保持在 __init__ 声明所有实例属性的良好做法。 ,所以我需要一些复杂的解决方案来完成这项工作。

我希望它如何表现的一个例子(目前 mypy 正在提示):

from typing import Optional

class Foo:
def __init__(self, x: int):
self.x = x
self.y: int = None # will initialize later, but I know it will be an int

def fill_values(self):
self.y = x**2

def do(self) -> int:
return self.x + self.y

目前 mypy 提示 self.y 的分配,并希望它是 OptionalNone .

如果我同意并将该行更改为 self.y: Optional[int] = None ,然后 mypy 提示 do 的返回值, 因为 self.y可能是 None .

我发现的唯一方法是在使用 self.y 之前添加 as assert ,例如: assert self.y is not None ,mypy 接受并理解。然而,用许多断言开始每个方法是相当困难的。我有很多这样的值,通常是一种初始化所有这些值的方法,所有其他方法都在它之后运行。

我知道 mypy 提示是正当的(方法 do 可以在 fill_values 之前调用),但即使我试图阻止它,我也无法让 mypy 接受这一点。我可以通过添加更多功能来扩展此示例,但 mypy 无法推断:
from typing import Optional

class Foo:
def __init__(self, x: int):
self.x = x
self.y: int = None # will initialize later, but I know it will be an int

def fill_values(self):
self.y = x**2

def check_values(self):
assert self.y is not None

def do(self) -> int:
if self.y is None:
self.fill_values()
self.check_values()
return self.x + self.y

关于多个断言语句和 Optional 的更优雅的解决方案的任何想法隐藏代码的类型?

最佳答案

我发现这对我有用:

class Foo:
def __init__(self, x: int):
self.x = x
self.y: int # Give self.y a type but no value

def fill_values(self):
self.y = x**2

def do(self) -> int:
return self.x + self.y
基本上你所做的只是告诉 mypy self.y当(如果)它被初始化时,它将是一个整数。尝试调用 self.y在初始化之前会引发错误,您可以使用 hasattr(self, "y") 检查它是否已初始化.

关于python - 将 mypy 与实例属性的延迟初始化一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60925137/

24 4 0
文章推荐: angular - NGRX:http 重试拦截器导致不触发失败操作
文章推荐: typescript :此表达式不可调用。类型 '{ getUserInfo(requestData: object): Promise; }' 没有调用签名