如何键入在函数的局部范围内定义的 return 值?
How to type hint a return value that's defined in the function's local scope?
给定以下示例:
class A:
def __init__(self, num: int):
self.num = num
def bar(self, eggs: int):
if eggs == self.num:
raise ValueError
def foo(spam: bool) -> B:
class B(A):
def bar(self, eggs: int):
try:
super().bar(eggs)
except ValueError as e:
if not spam:
raise e
return B
基础 class A
有一个名为 bar
的方法,它在 eggs
等于 self.num
时引发 ValueError
。我还有一个名为 foo
的函数,它接受一个参数 spam
,它 return 是 A
的子 class 并覆盖 bar
方法,所以如果 spam
不是 Falsey,则不会引发 ValueError
。
我正在尝试键入提示 foo
函数的 return 值。如果我做 -> B
,B
是未定义的。如果我这样做 -> A
,则类型 B
不完全是 A
。如果我使用 future hinting -> "B"
,B
仍未定义,因为它在本地范围内。
有什么提示吗?如果没有,有没有更好的方法重写我的代码?
以下是我快速浏览文档后想到的内容。这根本不是一个好的解决方案(我认为),但它应该可以为您完成工作。
有一个叫做 typing.TypeVar
(docs) 的东西。它基本上是一个通用类型。所以你可以做的是:
在全局层面(定义class A后)定义:
from typing import TypeVar
B = TypeVar('B', bound=A)
现在在 def foo
的函数签名中你可以说:
def foo(spam: bool) -> B:
然后在函数里面你可以继续新建一个名字为B的class和return它
我什至不确定这是否在所有情况下都能正常工作。如果您发现它有任何问题,请务必纠正我并在此处 post。
给定以下示例:
class A:
def __init__(self, num: int):
self.num = num
def bar(self, eggs: int):
if eggs == self.num:
raise ValueError
def foo(spam: bool) -> B:
class B(A):
def bar(self, eggs: int):
try:
super().bar(eggs)
except ValueError as e:
if not spam:
raise e
return B
基础 class A
有一个名为 bar
的方法,它在 eggs
等于 self.num
时引发 ValueError
。我还有一个名为 foo
的函数,它接受一个参数 spam
,它 return 是 A
的子 class 并覆盖 bar
方法,所以如果 spam
不是 Falsey,则不会引发 ValueError
。
我正在尝试键入提示 foo
函数的 return 值。如果我做 -> B
,B
是未定义的。如果我这样做 -> A
,则类型 B
不完全是 A
。如果我使用 future hinting -> "B"
,B
仍未定义,因为它在本地范围内。
有什么提示吗?如果没有,有没有更好的方法重写我的代码?
以下是我快速浏览文档后想到的内容。这根本不是一个好的解决方案(我认为),但它应该可以为您完成工作。
有一个叫做 typing.TypeVar
(docs) 的东西。它基本上是一个通用类型。所以你可以做的是:
在全局层面(定义class A后)定义:
from typing import TypeVar
B = TypeVar('B', bound=A)
现在在 def foo
的函数签名中你可以说:
def foo(spam: bool) -> B:
然后在函数里面你可以继续新建一个名字为B的class和return它
我什至不确定这是否在所有情况下都能正常工作。如果您发现它有任何问题,请务必纠正我并在此处 post。