Cheetah #include не помещает #def в область видимости

#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 с одним жестко закодированным аргументом в других шаблонах. Я мог бы легко просто создать эту переменную, которая в первую очередь изменяет поведенческую часть списка поиска, и это, вероятно, то, что вам также следует сделать :). Это также позволило бы мне передавать его с прикладного уровня вместо жесткого кодирования в моем шаблоне!

Скорее всего, это хороший дизайн, потому что он предотвращает сокращения, на которые часто идут американские разработчики, если им разрешено делать это легко.