당신은 정말로, 정말로, 정말로, 정말로 사용하고 싶지 않습니다 repr
그리고 eval
직렬화 형식으로.
방금 사용했다면 pickle
, 당신은이 문제가 전혀 없을 것입니다.
with open("task_list2.dat", "wb") as outFile:
pickle.dump(task_list, outFile)
with open("task_list2.dat", "rb") as file:
task_list = pickle.load(file)
훨씬 단순 해요?
그러나 무의미하게 만드는 대신 즉각적인 문제를 해결하는 방법을 알고 싶다면 : 여러분은 여러 가지 문제가 있습니다. __repr__
메소드는 왕복이 가능하기를 원한다면 모두 수정해야합니다.
- 문자열 표현을 생성 한 다음 전화합니다
repr
그 위에. 문자열 표현이 아닌 문자열 표현을 반환하고 싶습니다. 의 문자열 표현. 그냥 꺼내십시오repr
. - 당신은 항상 그에게 위임해야합니다
repr
하위 객체의str
. 사용하는 경우%
-형성, 즉 사용을 의미합니다%r
보다는%s
. - 물건 주위에 인용문을 추가하려고하지 마십시오. 객체 자체에 인용문, 백 슬래시, 보이지 않는 캐릭터 등이 없으면 작동 할 수 있지만 왜 그에 의존합니까? 인용문이 필요하다고 생각되면 항상 이전 규칙을 깨뜨렸다는 신호이며 대신 문제를 해결해야합니다.
이 수업에 대해 왕복 가능한 repr을 작성하는 방법은 다음과 같습니다.
def __repr__(self):
return 'Task(%r, %r)' % (self.name, self.timespent))
그리고 원하는 것을 확인할 수 있습니다.
>>> t = Task('task name', 23.4)
>>> t
Task('task name', 23.4)
>>> eval(repr(t))
Task('task name', 23.4)
물론 특정 예에서는 첫 번째 문제를 해결합니다 (가짜 호출 제거 repr
)는 단일 인용문을 제거하고 특정 예제를 작동 시켰을 것입니다. 당신은 또한 전화로 읽기 쪽에서 그것을 해킹 할 수 있습니다. eval
두 배. 또는이 특정 예를 위해 eval(s[1:-1])
또는 eval(s.strip("'"))
. 그러나 그와 같은 "수정"은 단일 All-Ascii-retter Word만큼 간단하지 않은 이름을 가지고 있으면 일단 가지고 나올 일반적인 문제를 디버깅하기가 더 어려워집니다.