python - 打字界面

标签 python python-3.x types

在 python 3 中键入“接口(interface)”的正确方法是什么?

在以下示例中:

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()

输入 factory 的返回值的正确方法是什么?功能?

它应该类似于“具有一个名为 foo 的单一方法的类型,它不接受任何参数并返回一个整数”。

但不确定我能找到如何做到这一点。

更新 : 这个问题是专属 打字。

最佳答案

您可以使用 typing.Union但是,听起来你真的想要结构类型不是名义上的。 Python supports this using typing.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()

请注意,结构类型非常适合 Python 的鸭式类型。 Python 的类型系统支持结构形式和名词形式。

关于python - 打字界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60330730/

相关文章:

python - PyQt5 窗口中嵌入的 matplotlib 图形的 x 轴大小(以像素为单位)

python-3.x - reg.coef_ 返回相同值两次

用于HTML解析的Python正则表达式(BeautifulSoup)

python - 如何更改抽奖的格式

python - Seaborn tsplot 错误

Haskell 类型错误

python - 可调用类型的定义是什么?

python - AWS EMR 从 S3 导入外部库

python - 如何正确地对 Python 脚本连接到 Redis 所需的时间进行基准测试?

mysql - 克、毫克、微克和千焦耳的最佳 mysql 数据类型