为什么这段代码给我一个“IndentationError:意外的unindent”

时间:2011-07-06 00:16:34

标签: python

下面的代码真的很烦我,我已经看了stackoverflow和谷歌但还没有找到任何东西,我是一个非常好的pyton程序员,还没有,至今,直到现在,发现一个我无法处理的错误。我已经尝试了所有的东西,但是代码的这种平和给了我 IndentationError:意外的unindent ,这很奇怪,因为正常的错误是“不可预见的缩进”,这意味着多次发布它的间距以及我的间距所以我通过整个代码和nada相同的错误,我正确地放入四个空格,一切仍然......没有。帮助

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)

6 个答案:

答案 0 :(得分:9)

我认为您的想法是根据模块是直接运行还是导入,将不同的装饰器应用于函数。不幸的是,这不会像你拥有它那样工作,因为装饰器调用需要在它之后立即跟随函数。但是,你可以这样做:

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)

或者,假设您在某处导入application,您可以from application import route开始,然后您不需要任何if语句。

答案 1 :(得分:3)

另一种可能的解决方案:

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)

答案 2 :(得分: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)

答案 3 :(得分:1)

我对使用装饰器的方式感到困惑,请查看:http://www.python.org/dev/peps/pep-0318/

我很确定你使用装饰器需要与函数定义本身处于相同的缩进级别。此外,第一个装饰器(@route())没有跟随它的功能。

答案 4 :(得分:0)

你不能以这种方式从装饰函数中分离装饰器。

你仍然可以计算你的装饰者,然后应用它:

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

答案 5 :(得分: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)