This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# | |
# list, dict, 그외 primitive 타입으로 이루어진 값을 서버가 들고있어야 | |
# 하는데 이게 런타임에 수정되는 경우를 막기 위해서 read-only 타입으로 | |
# 변경하는 함수를 만들었다. 처음 뜰때 한번만 불리는 함수라 성능은 고려 | |
# 대상이 아니었음. | |
# | |
class ReadOnlyDataTypeError(TypeError): | |
pass | |
class ReadOnlyDict(dict): | |
def __setitem__(self, k, v): | |
raise ReadOnlyDataTypeError(k, v) | |
def __delitem__(self, k): | |
raise ReadOnlyDataTypeError(k) | |
def to_read_only(o): | |
if isinstance(o, dict): | |
return ReadOnlyDict(zip(o.keys(), map(to_read_only, o.values()))) | |
elif isinstance(o, list): | |
return tuple(map(to_read_only, o)) | |
else: | |
return o | |
def test(): | |
s = {"a": "aaa", "b": "bbb", "c": {"z": [1,2,3], "k": {"f": [1,2,3]}}} | |
r = to_read_only(s) | |
print r | |
if __name__ == "__main__": | |
import doctest | |
doctest.testmod() | |
test() |
댓글 없음:
댓글 쓰기