Могу ли я адаптировать строки и встроенные типы в 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')