给出以下示例:
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
基类A
有一个名为bar
的方法,如果ValueError
等于eggs
,则会引发self.num
。我还有一个名为foo
的函数接受参数spam
,它返回A
的子类并覆盖bar
方法,这样就不会ValueError
如果spam
非虚假则提出。
我正在尝试输入提示foo
函数的返回值。如果我执行-> B
,则B
未定义。如果我-> A
,则B
类型不完全是A
。如果我执行-> "B"
,则使用将来的提示,B
仍未定义,因为它位于本地范围内。
无论如何都要输入提示吗?如果没有,是否有更好的方法来重写我的代码?
答案 0 :(得分:0)
这是我从快速扫描文档中可以想到的。这根本不是一个好的解决方案(我认为),但它应该为你做好。
有一种称为typing.TypeVar
(docs)的东西。它基本上是通用类型。所以你可能做的是:
在全局层面(定义A类之后)定义:
from typing import TypeVar
B = TypeVar('B', bound=A)
现在在def foo
的函数签名中,您可以说:
def foo(spam: bool) -> B:
然后在函数内部,您可以继续创建一个名为B的新类并将其返回。
我甚至不确定这在所有情况下是否都能正常工作。如果您发现任何问题,请务必纠正我并在此发布。