2011-07-06 16 views
1

以下のコードは本当に迷惑です私はstackoverflowとgoogleで見たことがありますまだ何も見つけていないと私はかなり良いpytonプログラマーであり、今までは、私は対処できないというエラーを見つけました。私はすべてを試しましたが、このコードの平和は私にIndentationErrorを与えています:予期しないインデントこれは普通のエラーは "undexpected indent"です。全体のコードとnadaの同じエラーと私は正しく4つのスペースに入れて、すべてはまだ...何も。助けて?なぜこのコードは私に "IndentationError:予期しないインデント"を与えます

from bottle import Bottle, run, route, static_file, debug 
from mako.template import Template as temp 
from mako.lookup import TemplateLookup 

lookup = TemplateLookup(directories=[base+'/templates']) 
application = Bottle() 

if __name__ == '__main__': 
    @route('/') 
else: 
    @application.route('/') 
def index(): 
    index_temp = lookup.get_template('index.html') 
    return index_temp.render(site=site, corperate=corperate, copyright=copyright) 
+5

デコレータ*を内側に置くことはできないと思います。そのような 'if'文です。それが問題だろうか? –

+3

具体的には、 'if'ブロック内の関数定義を期待しているので、' else'は予期せずインデントされていません。 –

答えて

9

あなたの考えは、モジュールが直接実行されているのか、インポートされているのかによって、異なるデコレータを関数に適用することです。残念なことに、デコレータの呼び出しにはすぐ後に続く関数が必要なので、これはあなたが持っている方法では機能しません。しかし、あなたはこのようにそれを行うことができます:あなたはどこかapplicationを輸入していると仮定すると、

if __name__ != '__main__': 
    route = application.route 

@route('/') 
def index(): 
    index_temp = lookup.get_template('index.html') 
    return index_temp.render(site=site, corperate=corperate, copyright=copyright) 

をそれとも、あなただけfrom application import routeを開始しことができ、その後、あなたはどんなif文を必要としません。

+1

+1クリーンなソリューション –

1

私はあなたがデコレータを使用している方法に困惑している、これをチェックアウト:http://www.python.org/dev/peps/pep-0318/

を私はデコレータの使用は、機能としてのインデントの同じレベルにする必要がありますかなり確信しています定義自体。また、最初のデコレータ(@route())には、それに続く機能はありません。

+1

私は完全なコードに更新しました。実際に置くことができるか、装飾されたものの周りに文があるかどうかはわかりません。@routeはURLのルートがこの例のようになる場所です@route '/')はlocalhost/ – gabeio

+0

のインデックスに移動します。いいえ、あなたはできるとは思いません。あなたの最初のデコレータの後の関数定義を期待し、 'else:'(期待する関数定義のように字下げされていない)を見て、例外をスローします。 – kcbanner

2

syntax of the def statementは、あなたのやろうとしていることを許可していません。

def index(): 
    index_temp = lookup.get_template('index.html') 
    return index_temp.render(site=site, corperate=corperate, copyright=copyright) 

if __name__ == '__main__': 
    index = route('/')(index) 
else: 
    index = application.route('/')(index) 
+0

ifステートメントの内部にデコレータを置くことはできませんか? – gabeio

+0

@C Genius Go:彼らが付いている機能がない。あなたはいつでもif呼び出しの中でデコレータ関数を設定し、それをデコレータとして使うことができます。 –

+0

ifステートメントを自分のデコレータの中に入れてください!デコレータ機能を書くのは難しいことではありません。 – pfctdayelise

0

このように装飾された機能からデコレータを取り外すことはできません。

それでもあなたはデコレータを計算し、それを適用することができます。ルートは他の何かのために必要されていない場合

if condition: 
    deco = route('/') 
else: 
    deco = application.route('/') 
@deco 
def foo(...): 
0

あなたはこの

route_decorator = route if __name__ == '__main__' else application.route 

@route_decorator('/') 
def index(): 
    index_temp = lookup.get_template('index.html') 
    return index_temp.render(site=site, corperate=corperate, copyright=copyright) 

ような何かを行うことができ、あなただけの

を言うことができます
if __name__ != '__main__': 
    route = application.route 

@route('/') 
def index(): 
    index_temp = lookup.get_template('index.html') 
    return index_temp.render(site=site, corperate=corperate, copyright=copyright) 
3

あなたが持っているものに近いもう1つの解決策:

def decorate(func): 
    if __name__ == '__main__': 
     @route('/') 
     def f(): 
      func() 
    else: 
     @application.route('/') 
     def f(): 
      func() 

    return f 

@decorate 
def index(): 
    index_temp = lookup.get_template('index.html') 
    return index_temp.render(site=site, corperate=corperate, copyright=copyright)