Что заставляет Pylint считать мой класс абстрактным?

Насколько я понимаю, Python (2.5.2) не имеет реальной поддержки абстрактных классов. Почему компания Pylint жалуется на то, что этот класс является "абстрактным классом, а не ссылкой"? Будет ли это делать для любого класса, который имеет NotImplementedError бросили?

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

"""Package Repository interface."""


class PackageRepository(object):
    """Package Repository interface."""

    def __init__(self):
        self.hello = "world"

    def get_package(self, package_id):
        """
        Get a package by ID.
        """
        raise NotImplementedError( \
                "get_package() method has not been implemented")

    def get_packages(self):
        """
        Get all packages.
        """
        raise NotImplementedError( \
                "get_packages() method has not been implemented")

    def commit(self):
        """
        Commit all changes.
        """
        raise NotImplementedError( \
                "commit() method has not been implemented")

    def do_something(self):
        """
        Doing something.
        """
        return self.hello

РЕДАКТИРОВАТЬ

Возможно, я должен уточнить. Я понимаю, что это абстрактный класс, и я хотел бы использовать ключевое слово abstract, но, насколько я понимаю, в Python это не имеет значения (по крайней мере, в версии, которую я сейчас использую), поэтому я не стал делать какие-то забавные абстрактные трюки (как те, которые найдены здесь) и просто не учел.

Я был удивлен, увидев, что Pylint осознает тот факт, что это абстрактный класс сам по себе. Что заставляет Pylint определить, что это абстрактный класс? Это просто ищет NotImplementedError быть брошенным куда-нибудь?

2 ответа

FWIW, поднятие NotImplementedError достаточно, чтобы заставить pylint думать, что это абстрактный класс (что абсолютно правильно). from logilab.org/card/pylintfeatures: W0223: Метод%r является абстрактным в классе%r, но не переопределяется. Используется, когда абстрактный метод (то есть, вызывает NotImplementedError) не переопределяется в конкретном классе. - Tobiesque 2 часа назад

По моему опыту, Pylint немного чрезмерно усердствует и бесполезен, пока вы не отключите ряд предупреждений.

Другие вопросы по тегам