사용자 인터페이스를 통해 수정되는 사전을 보관합니다. 사용자가 제어하는 '저장'기능을 사용하는 대신 사전이 변경 될 때마다 JSON 파일에 작성되도록하고 싶습니다. 나는 저장의 메카니즘을 알고 있지만, 사전의 변경을 저장하는 방법을 알지 못한다. 이것이 가능한가요, 그렇다면 어떻게 될까요?변경 될 때 사전 저장
2
A
답변
4
기본값은 dict
유형으로 설정할 수는 없지만 사용자 정의 사전 식 하위 클래스 또는 collections.MutableMapping
abstract base class 하위 클래스를 사용하여 사전을 변경하여 가로 채기를 실행할 수 있습니다.
후자와 가장 쉽습니다. 모든 수정 방법을 __setitem__
에 매핑합니다. overview table의 추상 메서드 열의 모든 메서드를 제공해야합니다.
는 다음과 같은 클래스의 내 빠른 스케치입니다 :
import json
from collections import MutableMapping
class JSONBackedMapping(MutableMapping):
def __init__(self, filename, initial=None, **kw):
self._filename = filename
try:
# Try and load the file
self.load()
except (ValueError, IOError):
# failure, fall back to the initial object
self._data = initial or {}
self._data.update(**kw)
def load(self):
with open(self._filename, 'r') as inf:
self._data = json.load(inf)
def save(self):
with open(self._filename, 'w') as outf:
json.dump(self._data, outf)
def __repr__(self):
return '<{}({!r}, {})>'.format(
type(self).__name__,
self._filename, self._data)
def __len__(self): return len(self._data)
def __iter__(self): return iter(self._data)
def __getitem__(self, item): return self._data[item]
def __delitem__(self, item):
del self._data[item]
self.save()
def __setitem__(self, item, value):
self._data[item] = value
self.save()
이 주어진 파일 이름에서로드하거나 실패 할 경우 초기 사전으로 시작됩니다. 키 - 값 쌍을 키워드 인수로 추가 할 수 있습니다. 모든 변경 사항은 JSON 형식의 파일이 아니지만 자동으로 JSON 형식으로 저장됩니다.
>>> data = JSONBackedMapping('data.json')
>>> data
<JSONBackedMapping('data.json', {})>
>>> data['foo'] = 'bar'
>>> data['spam'] = ['eggs', 'ham']
>>> print open('data.json').read()
{"foo": "bar", "spam": ["eggs", "ham"]}
>>> del data
>>> data = JSONBackedMapping('data.json')
>>> data
<JSONBackedMapping('data.json', {u'foo': u'bar', u'spam': [u'eggs', u'ham']})>
관련 문제
- 1. 변경 될 때마다 목록 저장
- 2. 세트가 변경 될 때 모델 변경
- 3. 변수가 변경 될 때 호출 될 후크
- 4. GtkWindow가 변경 될 때 GtkButton 색상 변경
- 5. template.dynamic이 변경 될 때 감지
- 6. PropertyChangedEventHandler가 변경 될 때 감지
- 7. 활성화 될 때 현지화 변경
- 8. UITableView가 변경 될 때 알림
- 9. 웹 콘텐트가 변경 될 때 알림
- 10. 데이터가 변경 될 때만 저장 jqgrid.saveRow
- 11. div가 옆에있을 때 div가 변경 될 때
- 12. 날짜가 데이터베이스에 저장 될 때 버그가 발생했습니다.
- 13. NSDocument가 저장 될 때 알림 받기
- 14. My IP가 mysql에 저장 될 때 변환됩니다.
- 15. datetime 필드가 저장 될 때 증가합니다.
- 16. MVC보기가 종료 될 때 자동으로 데이터 저장
- 17. 모델이 저장 될 때 "연결이 잘못되었습니다."
- 18. 필터가 변경 될 때 Datagrid가 업데이트되지 않습니다.
- 19. 변수가 변경 될 때 패널 집합 업데이트
- 20. iPhone에서 위치가 변경 될 때 알림 방법?
- 21. dte.Solution.SolutionBuild.StartupProjects가 변경 될 때 트리거되는 이벤트가 있습니까?
- 22. NSDatePicker - 변경 될 때 값 가져 오기
- 23. 데이터가 변경 될 때 telerik 차트 업데이트
- 24. 속성이 변경 될 때 DataTemplateSelector를 트리거하는 방법?
- 25. DataGrid.datacontext가 변경 될 때 열이 사라짐
- 26. designMode에서 Iframe의 콘텐츠가 변경 될 때 찾기
- 27. jQuery + Jeditable - 선택이 변경 될 때 감지
- 28. 모델이 변경 될 때 UI 업데이트
- 29. 해시가 변경 될 때 페이지 스크롤 방지
- 30. CRM에서 변경 될 때 소스의 업데이트 레코드
JSON 형식이 아닐지라도 'shelve'와 정확히 일치합니다. – roippi
@roippi :'shelve'도'collections.MutableMapping'을 사용합니다. –