Python печатать: опишите общие свойства - PullRequest
2 голосов
/ 17 марта 2020

У меня есть автоматически сгенерированный код, который определяет множество классов с общими свойствами, например, к сожалению, у них нет базового класса, интерфейса и т. Д. c.

class A:
    errors = []

class B
    errors = []

как я могу описать тип для этого? Я не могу легко изменить все эти типы.

def validate(obj: ???):
    if errors:
        raise Exception("something wrong")

1 Ответ

5 голосов
/ 17 марта 2020

Вам необходимо определить протокол, который выполняется с typing.Protocol в Python 3.8 или более поздней версии (в более ранних версиях можно найти Protocol в typing_extensions модуле.)

from typing import Protocol


class HasErrors(Protocol):
    errors: list


# Requires an object whose type supports the HasErrors
# protocol, namely one with a list-valued class attribute 
# named "errors"
def validate(obj: HasErrors):
    if obj.errors:
        raise Exception("something wrong")


class GoodClass:
    errors: List[Any] = []

class BadClass1:
    pass

class BadClass2:
    errors: int = 3

validate(GoodClass())  # will pass
validate(BadClass1())  # will not pass; no errors attribute
validate(BadClass2())  # will not pass; errors attribute has wrong type
...