2015-10-03 3 views
-1

Я реализую оболочку вокруг структуры данных массива Python. Я делаю это по практическим соображениям в своем приложении, но этот примерный код предоставляется только для воспроизведения проблемы. Кажется, что массив не очищается для каждого запроса через абстракцию Tornado.Проблема кэширования оболочки класса Python/Tornado

Если я не использую абстракцию массива, нет проблем. Это заставляет меня думать, что в реализации CPython есть ошибка.

from tornado import websocket, web, ioloop 
import json 

class Array(): 
    _data = [] 
    def push(self, value): 
     self._data.append(value) 

    def json(self): 
     return json.dumps(self._data) 


class ClientHandler(web.RequestHandler): 
    def prepare(self): 
     self.set_header("content-type", "application/json") 

    def get(self): 
     array = Array() 

     for i in range(0, 6): 
      array.push({'id': i}) 

     self.write(array.json()) 
     self.finish() 

app = web.Application([ 
    (r'/client', ClientHandler), 
], debug=True) 

if __name__ == '__main__': 
    kwargs = {"address": "127.0.0.1"} 
    app.listen(port=8888, **kwargs) 
    ioloop.IOLoop.instance().start() 

Выход я получаю после обновления страницы, как только я начал процесс питон следующим образом в последовательности:

Последовательность 1

[{"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}] 

Sequence 2

[{"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}, {"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}] 

Последовательность 3

[{"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}, {"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}, {"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}] 

Этот ответ является из не ожидаемые результаты. Ожидаемый выход должен иметь длину выходного массива JSON. Эта проблема НЕ выполняется, если я не обертываю структуру данных Python.

Почему это происходит? Я - новый восторженный пользователь Python, но этот тип препятствует мне использовать язык, если он не может справиться с простой абстракцией.

Extra

Для запуска этого:

  • установить пакет Торнадо в pip install tornado,
  • сохранить код я предоставил в файле app.py
  • выполнить python app.py
  • открыт веб-приложение в вашем браузере для http://127.0.0.1/client

ответ

0

Проблема в том, что Array._data на самом деле является статическим членом Array означает, что это значение будет одинаковым по всем экземплярам Array.

class Array(): 
    _data = [] 
    def push(self, value): 
     self._data.append(value) 

    def json(self): 
     return json.dumps(self._data) 

Чтобы решить эту проблему, сделайте _data экземпляром участника.

class Array(): 
    def __init__(self): 
     self._data = [] 

    def push(self, value): 
     self._data.append(value) 

    def json(self): 
     return json.dumps(self._data)