【问题标题】:python : name 'self' is not definedpython:名称'self'未定义
【发布时间】:2016-04-20 18:02:21
【问题描述】:

我收到以下代码的标题错误。有谁知道如何解决这一问题?我已经检查了 .py 文件上的制表符和空格,甚至尝试更改 var 的名称,但它没有用。提前感谢

import os
import jinja2
import webapp2

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=["jinja2.ext.autoescape"],
    autoescape=True)

class ConsumoHandler(webapp2.RequestHandler):
     def load_input(self):
        self.km=float(self.request.get("edKm","edKm"))
        self.consmed=float(self.request.get("edCons","edCons"))
        self.tiempo=float(self.request.get("edTiempo","edTiempo"))
        self.velMed=0
        self.consTot=0

    def post(self):
        self.load_input()
        self.km=str(self.km)
        self.consmed=str(self.consmed)
        self.tiempo=str(self.tiempo)
        velMed=(self.km)/(self.tiempo)
        self.velMed=str(velMed)
        consTot=(self.km)/((self.consmed)*4)
        self.consTot=str(consTot)

        template_values = { 
        'kmToStr':self.km,
        'consmedToStr':self.consmed,
        'tiempoToStr':self.tiempo,
        'velMedToStr':self.velMed,
        'consTotToStr':self.consTot, 
        }

    template_values = JINJA_ENVIRONMENT.get_template("answer.html")
    self.response.write(template.render(template_values));

app = webapp2.WSGIApplication([
    ('/calcu', ConsumoHandler)
], debug=True)

【问题讨论】:

  • self.response.write(template.render(template_values)); 不是在定义类时执行的方法的一部分。也许你把你的缩进弄混了?
  • 看起来你正在混合制表符和空格。重新配置您的编辑器以使用空格进行缩进,然后将剩余空格转换为制表符。
  • 问题:为什么 (self.response.write(template.render(template_values));) 包含尾随分号?除非您希望在同一行上评估多个事物,否则它不是必需的。

标签: python google-app-engine jinja2


【解决方案1】:

问题是这一行:

self.response.write(template.render(template_values));

它在类定义内,但不在方法内(第一个参数是self。所以这里不知道self...

您必须缩进它才能成为post 方法的一部分:

def post(self):
    ...
    template_values = { 
        ...
    }

    template_values = JINJA_ENVIRONMENT.get_template("answer.html")
    self.response.write(template.render(template_values));

【讨论】:

  • 完美回答!他可能打算在 post() 中执行两行代码。也许更新您的答案以说明这一点!
  • @TheLazyScripter 是的,添加了它。
【解决方案2】:

首先,self.response.write(template.render(template_values)); 行不能在此处的任何函数之外,因为那里没有 'self' 变量。

其次,这是一个猜测,基于您正在覆盖 template_values 变量的事实,您可能希望您的 post 方法类似于(注意最后两行缩进并使用变量名已更改):

def post(self):
    self.load_input()
    self.km=str(self.km)
    self.consmed=str(self.consmed)
    self.tiempo=str(self.tiempo)
    velMed=(self.km)/(self.tiempo)
    self.velMed=str(velMed)
    consTot=(self.km)/((self.consmed)*4)
    self.consTot=str(consTot)

    template_values = { 
    'kmToStr':self.km,
    'consmedToStr':self.consmed,
    'tiempoToStr':self.tiempo,
    'velMedToStr':self.velMed,
    'consTotToStr':self.consTot, 
    }

    template = JINJA_ENVIRONMENT.get_template("answer.html") # Do not overwrite template_values, and use correct indentation
    self.response.write(template.render(template_values));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    相关资源
    最近更新 更多