zer*_*kms 6 python types python-3.x
在python 3中键入“接口”的正确方法是什么?
在以下示例中:
class One(object):
def foo(self) -> int:
return 42
class Two(object):
def foo(self) -> int:
return 142
def factory(a: str):
if a == "one":
return One()
return Two()
Run Code Online (Sandbox Code Playgroud)
键入factory
函数返回值的正确方法是什么?
它应该类似于“具有单个方法的类型,该方法foo
不接受任何参数并返回一个整数”。
但不确定我能找到如何做到这一点。
UPD:这个问题专门针对打字。
你可以使用typing.Union
但是,听起来你真的想要结构类型而不是名义上的。Python 支持使用 usingtyping.Protocol
,这是 python 类型提示系统的支持部分,所以mypy
会理解它,例如:
import typing
class Fooable(typing.Protocol):
def foo(self) -> int:
...
class One(object):
def foo(self) -> int:
return 42
class Two(object):
def foo(self) -> int:
return 142
def factory(a: str) -> Fooable:
if a == "one":
return One()
return Two()
x = factory('one')
x.foo()
Run Code Online (Sandbox Code Playgroud)
请注意,结构类型非常符合 Python 的鸭子类型精神。Python 的类型系统支持结构形式和名义形式。