gpt4 book ai didi

python - 如何让 Mypy 与多个相互依赖的 mixin 一起工作?

转载 作者:行者123 更新时间:2023-12-01 15:30:18 26 4
gpt4 key购买 nike

目前在 Electrum 中,我们使用 Union type on self 能够访问来自多个混合父类的方法。例如,QtPluginBase依赖于混入HW_PluginBase的子类上类。例如,有效的用法是 class TrezorPlugin(QtPluginBase, HW_PluginBase) .

有 Qt gui、Kivy gui 和 CLI。尽管 Kivy 没有实现硬件钱包,但它们可能会在 future 实现。您已经可以在 CLI 上使用它们。

然而,也有多个硬件钱包制造商,都有自己的插件。

考虑 Trezor + Qt:

对于 Qt,我们有这个类层次结构:

  • electrum.plugins.hw_wallet.qt.QtPluginBase
  • 使用
  • electrum.plugins.trezor.qt.QtPlugin(QtPluginBase)

  • 对于 Trezor,我们有:
  • electrum.plugin.BasePlugin
  • 使用
  • electrum.plugins.hw_wallet.plugin.HW_PluginBase(BasePlugin)
  • 使用
  • electrum.plugins.trezor.trezor.TrezorPlugin(HW_PluginBase)

  • 并创建实际的 Qt Trezor 插件:
  • electrum.plugins.trezor.qt.Plugin(TrezorPlugin, QtPlugin)

  • 关键是基本的 gui-neutral 插件将首先获得制造商特定的方法;然后它将获得特定于 gui 的方法。

    Aaron(在评论中)建议 QtPluginBase可以子类 HW_PluginBase ,但这意味着制造商特定的东西会出现,这意味着生成的类不能被 CLI 或 Kivy 使用。

    请注意,两者
    electrum.plugins.trezor.trezor.TrezorPlugin(HW_PluginBase)

    electrum.plugins.hw_wallet.qt.QtPluginBase
    依赖 HW_PluginBase .他们不能同时继承它。

    因此,如果我们避免混入,那么唯一的选择就是使用 QtPluginBase子类 TrezorPlugin (但是厂家很多),或者 TrezorPlugin可以子类 QtPluginBase但是,同样,生成的类不能被 CLI 或 Kivy 使用。

    我意识到 Union是一个“或”,所以提示确实没有意义。但是没有 Intersection类型。使用 Union,大部分 PyCharm 功能都可以工作。

    如果 QtPluginBase 会很好的一件事是可能有一个类型提示,它是 HW_PluginBase 的子类,但实际上没有在运行时进行子类化。

    如何在不使用这个 hacky 的情况下使用 Mypy 输入此内容 Union在每个方法上键入提示(因为每个方法都有 self )?

    最佳答案

    mypy doesn't offer an Intersection type yet ,您不能输入 self arg 正确(而且 Union 不是它的替代品!)。您可以做的是为 mixin 引入基类,仅用于类型检查。这是我在 Django 项目中使用 mixin 时经常使用的技巧。例子:

    from typing import TYPE_CHECKING

    if TYPE_CHECKING:
    from .plugin import HW_PluginBase
    _Base = HW_PluginBase
    else:
    _Base = object


    class QtPluginBase(_Base):
    def load_wallet(self, wallet: 'Abstract_Wallet', window: ElectrumWindow):
    ...

    您现在可以删除 self 的显式类型自 mypy可以推断出所有必要的基类本身。

    关于python - 如何让 Mypy 与多个相互依赖的 mixin 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59311963/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com