Могу ли я адаптировать строки и встроенные типы в Z

У меня есть интерфейс, как:

class IRepository(Interface):
    def __init__(path, **options):
        pass

У меня есть реализации этого интерфейса как для Git, так и для Mercurial. Теперь я хочу написать репозиторий-фабрику, которая принимает строку (путь) и возвращает IRepository, проверяя, является ли это git или же hg репозиторий.

Тем не менее, просто говоря:

registerAdapter(repofactory, (str, unicode, ), IRepository)

не работает, потому что ни str ни unicode поддержать IInterface интерфейс.

Сейчас я собираюсь с:

registerAdapter(repofactory, (Interface, ), IRepository)

Но я хотел бы знать, существуют ли интерфейсы, которые соответствуют только строковым объектам и другим встроенным типам Python.

1 ответ

Решение

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

from zope.component import getUtilitiesFor, getUtility

names = [name for name, utility in getUtilitiesFor(IRepository)]

gitrepo = getUtility(IRepository, name='git')
Другие вопросы по тегам