#python #cheetah
#python #cheetah
Вопрос:
Когда я включаю файл, используя #include (без raw), он правильно анализирует содержимое, но #def, к которому я хочу получить доступ в исходном файле, не существует, и выдается ошибка.
Базовый шаблон:
#def sayHello($name)
hello $name
#end def
Шаблон:
#include "../../BaseTemplate.template"
$sayHello("fred")
Ответ №1:
Причина, по которой это происходит, заключается в том, что sayHello
это функция, добавленная в «Базовый шаблон» (который на самом деле является классом), но вы не можете получить к ней доступ в вызывающем шаблоне.
Я не уверен, что это лучший способ решить проблему, с которой вы столкнулись, но я полагаю, что вы можете создать defHello
статический метод с #@staticmethod
перед def
строкой, а затем импортировать шаблон вместо его включения.
На этой странице содержится дополнительная информация.
Ответ №2:
Что ж, похоже, вы можете сделать это с помощью атрибута:
self._CHEETAH__cheetahIncludes
Который представляет собой словарь, содержащий все ваши включения.
Используйте его из вашего шаблона после включения, подобного:
$self._CHEETAH__cheetahIncludes[include_id].the_function(*args)
Для меня include_id
так получилось, что это путь к файлу (я выяснил это, сначала распечатав _CHEETAH__cheetahIncludes
словарь, хех). Гарантировано ли это? Понятия не имею.
Рекомендую ли я это? Нет. Есть ли лучший способ доступа к функции? Похоже, что нет. Есть ли какие-либо недостатки? Понятия не имею, используйте на свой страх и риск. Может ли это быть кому-то полезно? Возможно 🙂
Я имею в виду, что это могло бы быть полезной функцией, потому что люди пытаются это сделать, но нужна ли эта функция? Вероятно, нет.
Мой вариант использования заключался в том, что я хотел повторно использовать фрагмент, который обращался бы к родительскому списку поиска, как это делают includes, но я хотел повторно использовать это include с одним жестко закодированным аргументом в других шаблонах. Я мог бы легко просто создать эту переменную, которая в первую очередь изменяет поведенческую часть списка поиска, и это, вероятно, то, что вам также следует сделать :). Это также позволило бы мне передавать его с прикладного уровня вместо жесткого кодирования в моем шаблоне!
Скорее всего, это хороший дизайн, потому что он предотвращает сокращения, на которые часто идут американские разработчики, если им разрешено делать это легко.