Почему zope.interface не реагирует на неправильное имя атрибута?

Всех приветствую. В книге наткнулся на главу про zope, решил попробовать на практике, но немного не могу понять результат.

Я так понял, что в пакете есть verifyObject и verifyClass для проверки экземпляров и классов на соответствие интерфейсу.

Мой код:

from zope.interface import Attribute, Interface, implementer
from zope.interface.verify import verifyObject, verifyClass

class ITest(Interface):
    name = Attribute('Тестовый атрибут!')
    def test_met():
        """Тестовый метод"""


@implementer(ITest)
class T:
    def __init__(self, name):
        self.name = name

    def test_met(self):
        ...


print(verifyObject(ITest, T(name='тест'))) # True 

Тут как будто всё в порядке. Если в экземпляре будут какие-то проблемы, то падает ошибка.

from zope.interface import Attribute, Interface, implementer
from zope.interface.verify import verifyObject, verifyClass

class ITest(Interface):
    name = Attribute('Тестовый атрибут!')
    def test_met():
        """Тестовый метод"""


@implementer(ITest)
class T:
    def __init__(self, name):
        self.bad_name = name               # неправильное имя атрибута 

    def test_met(self):
        ...


print(verifyObject(ITest, T(name='тест'))) # zope.interface.exceptions.BrokenImplementation

Если поменять имя метода, то тоже падает ошибка. Код вставлять уже не буду. Вроде бы и так понятно. Тут по сути нет проблем

Но если использовать verifyClass, то на неправильное имя метода выдаёт ошибку. А если поменять имя атрибута, то он выводит True

from zope.interface import Attribute, Interface, implementer
from zope.interface.verify import verifyObject, verifyClass

class ITest(Interface):
    name = Attribute('Тестовый атрибут!')
    def test_met():
        """Тестовый метод"""


@implementer(ITest)
class T:
    def __init__(self, name):
        self.bad_name = name               # неправильное имя атрибута

    def test_met(self):
        ...

# Передаю теперь класс, а не экземпляр
print(verifyClass(ITest, T))               # Почему True, если имя атрибута неверное? 

Подскажите, где я ошибся и что не так понял?


Ответы (0 шт):