Гепард #include не помещает #def в область видимости - PullRequest
2 голосов
/ 25 мая 2011

Когда я включаю файл с помощью #include (без raw), он правильно анализирует содержимое, но #def, к которому я хочу получить доступ в исходном файле, не существует и выдается ошибка.

Базовый шаблон:

#def sayHello($name)
hello $name
#end def

Шаблон:

#include "../../BaseTemplate.template"
$sayHello("fred")

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Причина, по которой это происходит, заключается в том, что sayHello - это функция, добавленная в «Базовый шаблон» (который на самом деле является классом), но вы не можете получить к ней доступ в вызывающем шаблоне.

I 'Я не уверен, что это лучший способ решить вашу проблему, но я считаю, что вы можете сделать defHello статическим методом с #@staticmethod перед строкой def, а затем импортировать шаблон вместо его включения.

Эта страница содержит больше информации.

0 голосов
/ 05 апреля 2012

Похоже, что вы можете сделать это через атрибут:

self._CHEETAH__cheetahIncludes

Это словарь, содержащий все ваши включения.

Используйте его из шаблона после включения, например:

 $self._CHEETAH__cheetahIncludes[include_id].the_function(*args)

Для меня include_id оказался путем к файлу (я выяснил это, сначала распечатав словарь _CHEETAH__cheetahIncludes, хе).Это гарантировано?Понятия не имею.

Я рекомендую это?Нет. Есть ли лучший способ получить доступ к функции?Кажется, не быть.Есть ли недостатки?Понятия не имею, пользуйтесь на свой страх и риск.Может ли это быть полезным для кого-то?Может быть:)

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

Мой вариант использования состоял в том, что я хотел повторно использовать фрагмент, который получал бы доступ к родительскому searchList, как и include, но я хотел повторно использовать это включение с одним жестко закодированным аргументом в других шаблонах. Я мог бы просто сделать эту переменную, которая в первую очередь изменяет часть поведения searchList, и это, вероятно, то, что вам следует делать :).Это также позволило бы мне передать его со слоя приложения вместо жесткого кодирования в моем шаблоне!

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

...