Cheetah:ディレクティブ
ディレクティブ構文規則
ディレクティブタグはハッシュ文字(#)で始まり、コメント、ループ、条件付きブロック、インクルード、およびその他すべての高度な機能に使用されます。 Cheetahは、ディレクティブタグ内でPythonに似た構文を使用し、有効なPython式を理解します。 {ただし、Pythonとは異なり、Cheetahはコロン(:)とインデントを使用して複数行のディレクティブをマークしません。}これは、テキストの一部として空白が重要な環境では機能しません。代わりに、{# for} のような複数行のディレクティブには、対応する終了タグ({#end for})があります。ほとんどのディレクティブは、Pythonステートメントの直接のミラーです。
多くのディレクティブには、開始タグの後に引数があります。これは、タグに指定された構文である必要があります。すべての終了タグの構文は次のとおりです。
code: python
式は無視されるため、基本的にはコメントです。
ディレクティブクロージャと空白の処理
ディレクティブタグは、シャープ記号(#)で明示的に閉じるか、省略した場合は暗黙的に行末で閉じることができます。
code: python
ブロックディレクティブの
本文のテキスト
これは、次と同じです。
code: python
ブロックディレクティブの
本文のテキスト
ディレクティブタグを明示的に閉じると、同じ行に他のテキストを続けることができます。
code: python
bah, bah, #if $sheep.color == 'black'# black#end if # sheep. ディレクティブタグが行の終わりで暗黙的に閉じられると、改行文字を含め、末尾の空白がすべて捨てられます。
code: python
"""
bar
"""
outputs
"""
foo bar
"""
while
"""
bar
"""
outputs
"""
foo
bar
"""
ディレクティブタグが暗黙的に閉じられ、その行に他のテキストがない場合、前の空白を含めて行全体が取り込まれます。
code: python
"""
foo
bar
"""
outputs
"""
foo
bar
"""
while
"""
foo
bar
"""
outputs
"""
foo
- bar
"""
出力の生成
#echoは複雑な式からの出力します。
書式
#echoディレクティブは、単純な$変数として記述できない式からの出力をエコーするために使用されます。
code: html
これは、次のようにレンダリングされます。l
code: html
Here is my silly, silly, silly, silly, silly example.
#silentは出力なしで式を実行します。
書式
#silentは#echoとは異なり式は実行しますが、その出力は破棄します。
code: html
Here is #silent $covertOperation() # nothing テンプレートで最初にPythonコードを実行する必要がある場合、たとえば、変数の値の計算、データベースへのアクセスなど、継承するdoEverything()メソッドに配置し、テンプレートの上部で#silentを使用してこのメソッドを呼び出すことができます。
書式
#raw ...#end rawタグペア内にあるテンプレート定義のセクションは、$変数 やその他のディレクティブを解析せずに逐語的に出力されます。 これは、デバッグやCheetahの例やチュートリアルに非常に役立ちます。
#rawは、概念的にはHTMLの<PRE>タグとLaTeXのverbatim {}タグに似ていますが、これらのタグとは異なり、#rawによって本文が特別なフォントや書体で表示されることはありません。 Cheetahはフォントについて何も意識しないし、それが何であるかを知らないためです。
書式
#slurpディレクティブは、表示されている行の末尾の改行を捨てて、次の行を現在の行に結合します。
ディレクティブの外側のスペースは、記述どおりに、そのまま出力されます。 前述のblack sheepの例では、blackの前とsheepの前にスペースがあります。 したがって、1行に複数のディレクティブを配置することはできますが、読みにくくなる場合があります。
code: python
- 各ディレクティブの間にスペースがあるか、
合計2つの余分なスペースがあります。
#if $a##echo $a + 1##end if - スペースはありませんが、##がコメントマーカーではないことを
確認するために注意深く調べる必要があります。
#if $a##echo $a + 1##end if ### A comment. - ### では、最初の # がディレクティブを終了し、続く2つの ## がコメントを開始します。
これは、出力に影響を与えずにディレクティブタグに空白を追加する方法も示しています。
#if $a##echo $a + 1##end if # ## A comment. - 読みやすくなりましたが、コメントの前にスペースがあります。
これは、#forループで特に役立ちます。
code: html
これは次のようにレンダリングされます。
code: html
0 1 2 3 4
変数への値のセット
書式
#setは、実行時にローカル変数を作成および更新するために使用されます。 式は任意のPython式にすることができます。 リスト内包表記の中間結果の一部でない限り、変数名の前に$を付けることを忘れないでください。
ここではいくつかの例を示します。
code: html
#set $size = $length * 1096 #set $buffer = $size + 1096 #set $area = $length * $width #set $prettyCountry = $country.replace(' ', ' ') #set 変数は、$deeply.nested.value、計算、または値の印刷可能なバージョンに短い名前を割り当てるのに役立ちます。 上記の最後の例では、country値のスペースをHTMLのノーブレークスペースエンティティに変換して、値全体がブラウザの1行に表示されるようにします。
#set 変数は#ifディレクティブでも役立ちますが、複雑な論理ルーチンはCheetahではなくPythonでコーディングする必要があることに注意してください。
code: html
または、Pythonの1行に相当する記述 A and B or Cという記述もできます。 この場合、Bは真値でなければならないことに注意してください。
繰り返しますが、真値は、ゼロ(0)、None、空の文字列(‘’)、空のリスト([])、空の辞書({})以外のものを言います。
code: html
#set $adj = $size > 1500 and 'large' or 'small' 注意 :Cheetahの1行表記の#ifは、変数を設定するのではなく出力を生成するため、このようには機能しません。
拡張代入演算子を使用することもできます。
code: html
## Increment $a by 5.
デフォルトでは、globalアトリビュートを使用しない限り、#set 変数はメソッド呼び出しまたはインクルードファイルに表示されません。例:#set global $var = EXPRESSION
グローバル変数は、すべてのメソッド、ネストされたテンプレート、およびインクルードされたファイルに表示されます。 この機能は、予期しない事態を防ぐために注意して使用してください。
書式
#delは#setの反対の挙動を示すものです。 設定されているローカル変数を削除します。 その使用法は、Pythonのdel文と同じです。
code: html
削除できるのはローカル変数のみです。 #set global 変数、searchList変数、またはその他のタイプの変数を削除することはできません。
書式
#attr}ディレクティブは、生成されたPythonクラスにクラスアトリビュートを作成します。 数字や文字列などの単純なPythonリテラルを割り当てるために使用する必要があります。 特に、式はsearchListの値または#set 変数に依存する必要があります。これらはコンパイル時に認識されないためです。
code: html
#attr $author = "Sir Walter Scott" このテンプレートまたは任意の子テンプレートは、次のように値を出力できます。
code: html
$title, by $author, version $version
テンプレートがテンプレートモジュール(*.py)にコンパイルされていると仮定すると、
etexts から派生したテンプレートのライブラリがある場合は、タイトルと作成者を抽出してデータベースに配置できます。 書式
#defディレクティブは、生成されたPythonクラスで新しいメソッドを定義するため、またはスーパークラスメソッドをオーバーライドするために使用されます。 これは、Pythonのdef文に類似しています。 ディレクティブ自体は出力を生成しません。 ただし、メソッドが後で$変数によって呼び出されるたびに、メソッドのコンテンツが出力(および実行されるディレクティブ)に挿入されます。
code: html
これはサンプルのメソッドのテキストです
$a $b $c(123) ## これらの変数名は他の場所で定義されています
## メソッドの使用
$myMeth()
引数と括弧は省略できます。
code: html
これはサンプルのメソッドのテキストです
$a $b $c(123)
## メソッドの使用
$myMeth
Pythonの場合と同様に、メソッドには引数を指定でき、それらの引数のデフォルトを設定できます。 変数名の前の$を忘れないようにしてください。
code: html
これはサンプルのメソッドのテキストです
$a - $b
## メソッドの使用
$myMeth(1)
この最後の例からの出力は次のようになります。
code: html
これはサンプルのメソッドのテキストです
1 - 1234
#defディレクティブの1行バージョンもあります。 {複数行のディレクティブとは異なり、コロン(:)を使用してメソッドのシグネチャと本文を区切ります。
code: html
#def myMeth: これは $adj メソッドです $myMeth
先頭と末尾の空白はメソッドから削除されます。 これは、以下とは対照的です。
code: html
これは $adj メソッドです
ここで、メソッドには'メソッドです'の後に改行が含まれます。 改行が必要ない場合は、#slurpを追加します。
code: html
これは $adj メソッドです#slurp
#defはコンパイル時に処理されるため、それを呼び出すプレースホルダーの上または下に表示される可能性があります。また、スーパークラスプレースホルダーがサブクラスでオーバーライドされたメソッドを呼び出す場合、呼び出されるのはサブクラスメソッドです。
#blockディレクティブを使用すると、サブクラスで選択的に再実装できるテンプレートのセクションにひとつの単位として扱うことができます。全体をコピーして貼り付けて編集しなくても、テンプレートの一部を変更するのに非常に便利です。ブロックを使用するテンプレート定義からの出力は、#block ... #endblock ディレクティブが削除された同じテンプレートからの出力と同じになります。
注意:一般的な単語の blockと混同しないようにしてでください。
これは、何かの文字列#TAG ... #end TAG ペア内のコードのセクションを意味します。
したがって、ifブロック、forブロック、defブロック、blockブロックなど。
ここでは、blockブロックについてのみ説明します。
ブロックを再実装するには、#defディレクティブを使用します。この効果は、再実装の場所ではなく、元のブロックが定義された時点に戻って出力テキストを変更するように見えることです。
code: html
コンテンツのテキスト
ブロックディレクティブの領域
$getFoo()
必要に応じて、#endblockディレクティブでブロック名を繰り返すかどうかを指定できます。
#blockディレクティブは任意の深さにネストできます。
code: html
外側のブロック(outerBlock)の内容
内側のブロック(innerBlock1)の内容
内側のブロック(innerBlock2)の内容
#endblockディレクティブのブロック名はオプションであることに注意してください。
技術的には、#blockディレクティブは、#defディレクティブの直後の同じ名前のブロック名が続くことと同等です。 実際、これはCheetahが内部で処理していることです。 つまり、テンプレートの他の場所で $ブロック名 を使用して、ブロックコンテンツを再度出力できます。
1行の#defに類似した1行の#block構文があります。
ブロックは引数を必要とするべきではありません
外部ファイルの取り込み
書式
#includeディレクティブは、テンプレート定義の外部からのテキストを含めるために使用されます。 テキストは、外部ファイルまたは$変数から取得できます。 Cheetahは、外部ファイルを操作するときに、含まれているファイルへの変更を監視し、必要に応じて更新します。
この例は、外部ファイルでの使用法を示しています。
code: html
読み込まれる FileName.txtの内容は、Cheetah によって解析されます。
次の例は、$変数で読み込むファイル名を与える方法を示しています。
code: html
$myParseTextの値は、Cheetahによって解析されます。 これは、テンプレート定義に変数タグ
$ myParseTextを単に配置することと同じではありません。 後者の場合、$myParseTextの値は解析されません。
デフォルトでは、含まれているテキストはCheetahタグ用に解析されます。 raw=引数を使用して、解析を抑制することができます。
code: html
Cheetahは、ネストされたTemplateオブジェクト内に#includeテキストの各チャンクをラップします。 ネストされた各テンプレートには、メインテンプレートのsearchListのコピーがあります。 ただし、set変数は、#set globalキーワードを使用して定義されている場合にのみインクルード全体に表示されます。
すべてのディレクティブは、インクルードファイルでバランスを取る必要があります。 つまり、インクルード内で#forまたは#ifブロックを開始する場合は、同じインクルードで終了する必要があります。
書式
#impor}および#fromディレクティブは、外部Pythonモジュールまたはオブジェクトをプレースホルダーで使用できるようにするために使用されます。 構文はPythonのインポート構文と同じです。 インポートされたモジュールは、生成されたPythonクラスのすべてのメソッドにグローバルに表示されます。
code: html
#from math import sin, cos #from math import sin as _sin #from mx import DateTime # ## Part of Egenix's mx package. 上記のインポートの後、$math、$mathModule、$sin、$cos、$_sin、$random、$ re、$DateTimeを$変数と式が利用することができます。
すべてのテンプレートはCheetah.Template.Templateのサブクラスです。 ただし、テンプレートが別のテンプレートまたは純粋なPythonクラスをサブクラス化することは可能です。 これは、#extends がステップインする場所です。親クラスを指定します。
Cheetahは、まだインポートしていない場合、#extendsディレクティブに記載されているクラスを自動的にインポートします。 暗黙的なインポートは次のように機能します。
code: html
## 暗黙的に '#from Superclass import Superclass' と同じ
## 暗黙的に '#from Cheetah.Templates.SkeletonPage import SkeletonPage' と同じ
書式
スーパークラスが通常とは異なる場所にある場合、またはクラスとは異なる名前のモジュールにある場合は、明示的にインポートする必要があります。インポートされていないクラスからの拡張はサポートされていません。たとえば、文字列から動的に作成されたテンプレートから。親テンプレートをモジュールに取り込む最も実用的な方法はそれをプリコンパイルすることであるため、すべての親テンプレートは基本的にプリコンパイルする必要があります。
テンプレートには#extendsディレクティブを1つだけ含めることができ、クラスを1つだけリストすることができます。つまり、テンプレートは多重継承を行いません。これは意図的なものです。テンプレート内から複数の基本クラスを正しく初期化するのは非常に困難です。ただし、純粋なPythonクラスで多重継承を行うことができます。
純粋なPythonクラスが__ init__()やawake()などの標準のTemplateメソッドのいずれかをオーバーライドする場合は、必ずメソッドでスーパークラスメソッドを呼び出すようにしてください。そうしないと問題が発生します。スーパークラスメソッドの呼び出し例は、セクションtips.callingSuperclassMethodsにあります。
いずれの場合も、ルートスーパークラスはTemplateである必要があります。最下位のクラスがテンプレートの場合は、その中の#extendsを省略するだけで、Templateから自動的に継承されます。 最下部のクラスが純粋なPythonクラスである場合、Templateから明示的に継承する必要があります
code: python
from Cheetah.Template import Template
class MyPurePythonClass(Template):
# ..
PythonクラスをTemplateから継承することに関心がない場合は、クラスとTemplateの両方から継承する小さなグルークラスを作成します。
例を示す前に、Cheetahが継承ツリーをどのように構成するかを、指示しないことを強調します。 上記のルールに従う限り、多くの構造が可能です。
これは、一般的なサイトテンプレートだけでなく、サイトのこのセクションのテンプレートと、各URLの特定のテンプレートサーブレットを含む大規模なWebサイトの例です。 各テンプレートは、テンプレートで使用されるメソッド/属性を含む純粋なPythonクラスから継承します。 最下位のスーパークラスから始めて、特定のテンプレートサーブレットで終わります。
code: html
1. SiteLogic.py (サイトのためのメソッドを含むPythonで実装されたクラス)
from Cheetah.Template import Template
class SiteLogic(Template):
2. Site.tmpl/py (一般的なサイトフレームワークを含むテンプレート。
これは出力を制御するテンプレートです。
<HTML> <HEAD> ...を含むもの、
#def /#blockの外側にテキストを含むもの)
#from SiteLogic import SiteLogic 3. SectionLogic.py (セクションのヘルパーコード含むPythonで実装されたクラス)
from Site import Site
class SectionLogic(Site)
4. Section.tmpl/py (セクションの#defオーバーライドなどを含むテンプレート)
#from SectionLogic import SectionLogic 5. page1Logic.py (テンプレートサーブレットのヘルパーコードを含むPythonで実装されたクラス)
from Section import Section
class indexLogic(Section):
6. page1.tmpl/py (テンプレート-サイトの特定のページのサーブレット)
#from page1Logic import page1Logic 純粋なPythonクラスには、直接の子テンプレートでは使用されないが、必要に応じて子孫テンプレートで使用できるメソッド/アトリビュートが含まれている場合もあります。 たとえば、サイトテンプレートには、サイト管理者の名前と電子メールアドレスの属性があり、必要なテンプレートで$変数としてすぐに使用できます。
#extendsを使用する場合は常に、上記の手順2のように#implementsも必要になることがよくあります。 次のセクションを読んで、#implements とは何か、いつ使用するかを理解してください。
#defまたは#blockメソッドを直接呼び出して、その出力を取得できます。 トップレベルのコンテンツ(#def / #blockの外側にあるすべてのテキスト/プレースホルダー/ディレクティブ)は連結され、デフォルトでrespond()メソッドにラップされます。 したがって、respond()を呼び出すと、テンプレート全体の出力が得られます。 したがって、Webwareが respond() を呼び出すと、テンプレート全体が出力されます。また、テンプレートインスタンスでprint()またはstr(t)を実行すると、Cheetahが __str__()メソッドが呼び出されるメソッドのエイリアスにするという事実を利用しています。
それはすべて問題ありませんが、アプリケーションが respond() ではなく別のメソッド名を呼び出すことを好む場合はどうでしょうか。 たとえば、代わりに send_output() を呼び出したい場合はどうなりますか? そこで #mplements がステップインします。これにより、メインメソッドの名前を選択できます。 これをテンプレート定義に入れるだけです:
code: html
あるテンプレートが別のテンプレートを拡張する場合、継承チェーン内のすべてのテンプレートには独自のメインメソッドがあります。テンプレートに入力するには、これらのメソッドの1つだけを呼び出し、他のメソッドは無視されます。呼び出すメソッドは、アプリケーションの構造に応じて、継承チェーン内の任意のテンプレート(ベーステンプレート、リーフテンプレート、またはそれらの間)に含めることができます。したがって、2つの問題があります。(1)正しいメソッド名を呼び出すことと、(2)不要な同じ名前のサブクラスメソッドが呼び出したいメソッドをオーバーライドできないようにすることです。
Cheetahは、呼び出すメソッドがrespond()であると想定しています。これは、Webwareが呼び出すものだからです。#blockで適切に機能するため、目的のメソッドが最下位レベルのベーステンプレートのメソッドであると想定します。したがって、#extends を使用すると、Cheetahはそのテンプレートのメインメソッドを writeBody()に変更して、邪魔にならないようにし、ベーステンプレートのrespond() をオーバーライドしないようにします。
残念ながら、テンプレートが他の方法で使用されている場合、この仮定は破綻します。たとえば、最高レベルのリーフテンプレートでメソッドを使用し、ベーステンプレートを単なるメソッド/属性のライブラリとして扱いたい場合があります。その場合、リーフテンプレートは、メソッド名をrespond()(またはアプリケーションが呼び出したいもの)に戻すために#implementsrespondが必要です。同様に、メインメソッドが継承チェーンの中間テンプレートの1つにある場合、そのテンプレートには#mplementsresponseが必要です。
仮定が崩れるもう1つの方法は、ベーステンプレートのメインメソッドであるが、そのテンプレートが純粋なPythonクラスを拡張する場合です。 Cheetahは#extendsを確認し、メソッドの名前をwriteBody() に忠実に、しかし誤って変更するため #implementsrespond を使用して元に戻す必要があります。それ以外の場合は、Cheetah.Template内のダミーのrespond()が見つかり、何も出力されません。 したがって、#extends を使用していて出力が得られない場合、{最初の}ことを考える必要があります。
制御構造
制御構造とは、プログラムのフロー制御をするすべてのものを指します。
Cheetah では次のフロー制御をサポートしています。
{#for}ディレクティブはシーケンスを繰り返し処理します。 構文はPythonと同じですが、変数の前のシャープ記号($)を忘れないようにしてください。
書式
次のテンプレートは#forの簡単な例です。
code: html
<TABLE>
#for $client in $service.clients <TR>
<TD>$client.surname, $client.firstname</TD>
<TD><A HREF="mailto:$client.email" >$client.email</A></TD>
</TR>
</TABLE>
辞書のキーと値をループする方法は次のとおりです。
code: html
<PRE>
#for $key, $value in $dict.items() $key: $value
</PRE>
ハイフンで区切られた番号のリストを作成する方法は次のとおりです。 この#endforタグは、各ハイフンの後に改行文字が導入されないように、最後の行を共有します。
code: html
{#end for} の場所がインデンテーションの妥当性を損なう場合は、代わりに次のようにすることができます。
code: html
前の2つの例では、最後の番号の後に余分なハイフンを配置します。 #setディレクティブを使用して、この問題を回避する方法を次に示します。これについては、以下で詳しく説明します。
code: html
$sep$name
文字列の間にセパレータを配置するだけですが、forループは必要ありません。
code: html
特定の回数何かをします。 引数は任意の数式にすることができます。 ゼロまたは負の場合、ループはゼロ回実行されます。
書式
次のテンプレートは#repeatの簡単な例です。
code: html
She loves me, she loves me not.
She loves me.
ループ内では、どの反復を行っているかを判断する方法はありません。 カウンター変数が必要な場合は、Pythonのrange()関数で代わりに#forを使用してください。 Pythonの範囲はデフォルトでベース0であるため、1からカウントを開始する方法は2つあります。1から5までカウントしたいとし、$countは5です。
code: html
#for $i in $range($count) $step. Counting from 1 to $count.
#for $i in $range(1, $count + 1) $i. Counting from 1 to $count.
以前の実装では、繰り返しカウンターとしてローカル変数{$ i}を使用していました。 ただし、これにより#repeat のインスタンスがネストされなくなりました。 現在の実装では #repeat のすべてのインスタンスに新しいローカル変数を使用するため、この問題は発生しません。
#whileはPythonのwhile文と同じです。 その後に任意のブール式を続けることができます。
書式
次のテンプレートは#whileの簡単な例です。
code: html
#while $someCondition('arg1', $arg2) 条件式は真値
無限ループを作成しないように注意してください。 #while 1は、コンピュータのメモリが不足するまでループすることになります。
これらのディレクティブは、Pythonと同様に使用されます。 #breakは#forループを途中で終了しますが、#continueはすぐに#forループの次の反復にジャンプします。
書式
この例では、出力リストに10 - は含まれません。
code: html
この例では、'Joe'に等しい名前が見つかるとループが終了します。
code: html
書式
#ifディレクティブは、テキストの一部を条件付きで表示するために使用されます。 #ifと#elseifの後に条件式を続ける必要がありますが、# elseには不要です。有効なPython式はすべて許可されます。 Pythonと同様に、ゼロ(0)、 空の文字列(‘’)、None、空のリスト([])、または空の辞書({})に評価されない限り、式は新値(True)です。 Pythonとは異なり、# elifは #elseif の同義語として受け入れられます。
ここではいくつかの例を示します。
code: html
大きい
#else if $size < 1500 and $size > 0 小さい
それら以外
code: html
The item $item.name is OK.
これは、#ifディレクティブと#forディレクティブを組み合わせた例です。
code: html
<table>
<tr>
<th>Name</th>
<th>Address</th>
<th>Phone</th>
</tr>
<tr>
<td>$p.name</td>
<td>$p.address</td>
<td>$p.phone</td>
</tr>
</table>
<p> Sorry, the search did not find any people. </p>
1行での#if
書式
#if EXPR1 then EXPR2 else EXPR3# フロー制御のための#ifディレクティブには、1行で記述する方法もあります。 EXPR1がTrueの場合、EXPR2を評価し、結果を出力します。(#echo EXPR2#と同様の結果)。 EXPR1がTrueでない場合は、EXPR3を評価し、その結果を出力します。 このディレクティブでは不要な式は評価されません。
Python のif文でいうところのthenとelseの両方を含める必要があります。 これがうまくいかない場合や、このスタイルが気に入らない場合は、複数行の#ifディレクティブを使用してください。
末尾の#は、通常のディレクティブの終端文字です。 いつものように、同じ行のディレクティブの後に何もない場合は省略することができます。
書式
#unlessは #if の反対の挙動をするものです。条件式が偽値(False)として評価される場合、テキストが実行されます。 ときによりこれはとても便利です。
#unless EXPR は #if not(EXPR) と同等です。
code: html
This parrot is no more! He has ceased to be!
'E's expired and gone to meet 'is maker! ...
THIS IS AN EX-PARROT!!
#ifとは異なり、#unless構造内で#elseif または #else を使用することはできません。
書式
#passディレクティブはPythonのpassステートメントと同じです。何もしません。 文が構文的に必要であるが、プログラムがアクションを必要としない場合に使用できます。
次の例は、$ Aのみが真の場合は何もしません
code: html
do something
do something
do something
#stopディレクティブは、特定の時点でテンプレートの処理を停止するために使用されます。 出力には、その時点までに処理されたものだけが表示されます。
#stopが#include内で呼び出されると、インクルードされた残りのコードをスキップして、
#includeディレクティブの後から続行します。 含まれているコードの処理を停止します。 同様に、#stopが#defまたは#block内で呼び出されると、#defまたは#blockのみが停止します。
code: html
猫が
マットの上に座った
ネズミを見ている
姿勢を低くして
これは次のようにレンダリングされます。
code:html
猫が
マットの上に座った
次の例では。
code: html
猫が
マットの上に座った
ネズミを見ている
姿勢を低くして
出力は次のようになります。
code: html
猫が
マットの上に座った
姿勢を低くして
これはPythonと同じように使用されます。 #returnは、デフォルトの戻り値Noneまたは指定された値で現在のメソッドを終了します。 #defまたは#block内でのみ使用できます。
書式
#returnは、呼び出されたメソッドから出力されたすべてのテキストの合計を返す#stopディレクティブとは異なることに注意してください。 次の例は、この点を示しています。
code: html
1
3
1.5
99999
これは次のようにレンダリングされます。
code: html
1
2
3
一方次の例では。
code: html
1
$test
3
1.5
99999
code: html
1
1.5
3
エラーハンドリグ
Cheetahでランタイムエラー(例外)を処理する方法は2つあります。 1つ目は、Pythonの構造化された例外処理ステートメントを反映するCheetahディレクティブを使用することです。 2つ目は、チーターのErrorCatcherフレームワークです。 これらについて以下に説明します。
Cheetahの例外処理ディレクティブは、Pythonの例外処理ステートメントを正確に反映しています。 次のチーターコードは、それらの使用法を示しています。
code: html
$mightFail()
It failed
They're not the same!
$mightFail()
Hey, it raised a ValueError!
Hey, it raised a NameMapper.NotFound!
It didn't raise anything!
$mightFail()
$cleanup()
Pythonと同様に、#exceptと#finally は同じtryブロックに表示できませんが、ネストされたtryブロックには表示できます。
書式
ErrorCatcherは、$placeholder タグ内で発生する例外をキャッチし、開発者にカスタマイズ可能な警告を提供するデバッグツールです。 通常、最初に欠落している名前空間値はNameMapper.NotFoundエラーを発生させ、テンプレートの入力を停止します。 これには、開発者が後続の出力を見ずに例外を順番に解決する必要があります。 ErrorCatcherを有効にすると、開発者はすべての例外とその周辺のテンプレート出力を一度に確認できます。
Cheetah.ErrorCatchersモジュールは、ErrorCatchersのベースクラスを定義します。
code: python
class ErrorCatcher:
_exceptionsToCatch = (NameMapper.NotFound,)
def __init__(self, templateObj):
pass
def exceptions(self):
return self._exceptionsToCatch
def warn(self, exc_val, code, rawCode, lineCol):
return rawCode
このErrorCatcherは、NameMapper.NotFound例外をキャッチし、問題のあるプレースホルダーをテンプレート出力に未加工の形式で表示したままにします。 次のテンプレートが実行された場合:
code: html
#set $iExist = 'Here I am!' これは正しいプレースホルダー: $iExist
これは間違ったプレスホールダー: $iDontExist
出力は次のようになります。
code: html
これは正しいプレースホルダー: Here I am!
これは間違ったプレスホールダー: $iDontExist
Cheetah.ErrorCatchersは、ありな方法でなしでしたするするの特殊なサブクラスももします。Cheetah.ErrorCatchers.Echo、 Cheetah.ErrorCatchers.BigEchoがいかされます
code: html
Here's a good placeholder: Here I am!
Here's bad placeholder: ===============<$iDontExist could not be found>===============
ErrorCatcherはパフォーマンスに大きな影響を与え、デフォルトでオフになっています。 TemplateクラスのerrorCatcherキーワード引数を使用してオンにすることもできます。 この引数の値は、Cheetah.ErrorCatchersのどのクラスを使用するかを指定する文字列、またはCheetah.ErrorCatchers.ErrorCatcherをサブクラス化するクラスのいずれかである必要があります。 #errorCatcherディレクティブを使用して、テンプレートの途中でerrorCatcherを変更することもできます。
Cheetah.ErrorCatchers.ListErrorsは、後で取得できるエラーのリストを維持しながら、Echoと同じ出力を生成します。 リストを取得するには、TemplateクラスのerrorCatcher()メソッドを使用してerrorCatcherを取得してから、そのlistErrors()メソッドを呼び出します。
ErrorCatcherは、ディレクティブ内で発生した例外をキャッチしません。