如何在 Python 联合类型别名上声明方法?

问题描述 投票:0回答:1

假设我有两个班级,

A
B
:

class A:
  def f() -> bool:
    ...

class B:
  def f() -> bool:
    ...

后来我输入这些别名:

from typing import Union
FClass: TypeAlias = Union[A, B]

这样我在另一个地方就可以有一个函数:

def g() -> FClass:
  ...  # Returns an object that is either A or B.


n = g()
n.f()  # This complains!

这里对

f()
的调用对于检查器来说看起来很糟糕,因为
f()
没有在
FClass
上声明,即使它在所有可能的类型上都声明了。有没有办法声明该方法将始终存在于具有该别名的类上(类似于 Java 接口)?或者有更好的方法来解决这个问题吗?具体投诉:

'A | B' has no attribute 'f'

请注意,

A
B
不受我的控制,
g()
的内部结构也是如此。实际用例是一个多轨库(即“alpha”、“beta”、“一般受众”),它们具有不同的生成内部对象,但共享一个 API。

python python-typing
1个回答
0
投票

你想要的是一个

Protocol
:

from typing import Protocol

class F(Protocol):
    def f() -> bool: ...
© www.soinside.com 2019 - 2024. All rights reserved.