【问题标题】:How to define the type of a dictionary of classes for mypy?如何为 mypy 定义类字典的类型?
【发布时间】:2020-08-31 00:06:58
【问题描述】:

我有几个使用静态方法来实现行为的类。我将它们收集在 python 字典中。如何写下 mypy 的字典类型?下面的例子。

#!/usr/bin/env python3


from typing import Dict
from abc import ABCMeta, abstractmethod
import enum


class Cuties(enum.Enum):
    Doggo = enum.auto()
    Kitty = enum.auto()
    Birb = enum.auto()


class Animal(metaclass=ABCMeta):

    @staticmethod
    @abstractmethod
    def give_sound() -> str:
        ...

    @staticmethod
    @abstractmethod
    def likes_ferrets(ferret_fur_colour: str) -> bool:
        ...


class Doggo_Specifics(Animal):

    @staticmethod
    def give_sound() -> str:
        return 'woofle'

    @staticmethod
    def likes_ferrets(ferret_fur_colour: str) -> bool:
        return False


class Kitty_Specifics(Animal):

    @staticmethod
    def give_sound() -> str:
        return 'meow'

    @staticmethod
    def likes_ferrets(ferret_fur_colour: str) -> bool:
        return True


class Birb_Specifics(Animal):

    @staticmethod
    def give_sound() -> str:
        return 'peep'

    @staticmethod
    def likes_ferrets(ferret_fur_colour: str) -> bool:
        return ferret_fur_colour == 'brown'


Specifics: Dict[Cuties, Animal] = {
    Cuties.Doggo: Doggo_Specifics,
    Cuties.Kitty: Kitty_Specifics,
    Cuties.Birb: Birb_Specifics,
}

mypy 给出Specifics 类型的错误:

test.py:62: error: Dict entry 0 has incompatible type "Cuties": "Type[Doggo_Specifics]"; expected "Cuties": "Animal"
test.py:63: error: Dict entry 1 has incompatible type "Cuties": "Type[Kitty_Specifics]"; expected "Cuties": "Animal"
test.py:64: error: Dict entry 2 has incompatible type "Cuties": "Type[Birb_Specifics]"; expected "Cuties": "Animal"

我应该如何定义Specifics的类型?

【问题讨论】:

  • 这能回答你的问题吗? Type hints with user defined classes
  • 正如副本所说,您应该从typing 导入Type 并将您的字典输入为Specifics: Dict[Cuties, Type[Animal]] = {...}

标签: python types mypy


【解决方案1】:

好的,不同的想法。即使这段代码在我的机器上运行,它也会警告我可能的类型不匹配。我找到了一种处理该警告的方法,即使它看起来很愚蠢。尝试将“class”添加到 Animal:

Specifics: Dict[Cuties, Animal.__class__] = {
    Cuties.Doggo: Doggo_Specifics,
    Cuties.Kitty: Kitty_Specifics,
    Cuties.Birb: Birb_Specifics,
}

【讨论】:

  • 这对我来说没有通过没有错误的 mypy 检查:test.py:61: error: Function "builtins.object.__class__" is not valid as a type
猜你喜欢
  • 1970-01-01
  • 2017-05-03
  • 2021-04-06
  • 1970-01-01
  • 2018-09-29
  • 2018-12-19
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多