打字界面

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:这个问题专门针对打字。

jua*_*aga 9

你可以使用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 的类型系统支持结构形式和名义形式。

  • 只是从我自己删除的答案中提一下,“typing.Protocol”仅从 Python 3.8 开始可用。3.6 和 3.7 版本可以从 [`typing_extensions`](https://github.com/python/typing/tree/master/typing_extensions) 导入 `Protocol`。 (3认同)