2014-06-07 16 views
7

Jestem nowy w Pythonie i po prostu uczę się go jak pracuję nad tym projektem, a ten problem jest naprawdę mylący. Oto mój kod:Kolba: TypeError: obiekt 'int' nie jest wywoływalny

from flask import Flask 
from datetime import datetime 

# Setup app 
app = Flask(__name__) 

# Initialize data dict 
data = {} 

# Pretty-formats a time difference 
def formatdifference(delta): 
    seconds = delta.total_seconds() 
    if (seconds < 60): 
     return "{seconds} seconds ago" % {"seconds": seconds} 

    return "{minutes} minutes ago" % {"minutes": seconds/60} 

# Sets a device battery level 
@app.route("/set/<device>/<int:battery>") 
def set(device, battery): 
    data[device] = (battery, datetime.now()) 
    return "done" 

# Get's a device battery level 
@app.route("/get/<device>") 
def get(device): 
    if not device in data: 
     return "No heartbeats" 

    devicedata = data[device] 
    delta = datetime.now() - devicedata[1] 

    if (delta.total_seconds() > 10): 
     return "Last heartbeat {diff}" % {"diff": formatdifference(delta)} 

    return devicedata[0] 

if __name__ == "__main__": 
    app.run(debug=True, host='0.0.0.0') 

Dzwonię pod numer /set/phone/40. Jak dotąd wszystko dobrze. Następnie dzwonię pod numer /get/phone. Nie zbyt dobrze. Oto traceback:

TypeError: 'int' object is not callable 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1478, in full_dispatch_request 
    response = self.make_response(rv) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1577, in make_response 
    rv = self.response_class.force_type(rv, request.environ) 
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 825, in force_type 
    response = BaseResponse(*_run_wsgi_app(response, environ)) 
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/test.py", line 855, in run_wsgi_app 
    app_iter = app(environ, start_response) 
TypeError: 'int' object is not callable 

Korzystanie debugger kolba jest, widzę, że w ostatniej klatce, aplikacja wydaje się być 40!

Jakim cudem to się stało, i jak mogę go rozwiązać?

+0

Czy to znaczy 'str powrotny (devicedata [0])'? – falsetru

+0

@falsetru Wygląda tak, jak ja! To rozwiązało, dzięki! – JJJollyjim

Odpowiedz

11

Należy zwrócić obiekt ciąg, nie int obiektu:

Wymień następujący wiersz:

return devicedata[0] 

z:

return str(devicedata[0]) 

Lub zastąpić następującą linię :

data[device] = (battery, datetime.now()) 

z:

data[device] = (str(battery), datetime.now()) 
Powiązane problemy