【发布时间】:2018-09-17 01:22:21
【问题描述】:
有没有办法在不将对象加载到内存的情况下获取磁盘上对象的字符串表示形式?我想过在从对象上调用open() 返回的文件对象上调用repr(),但这会返回文件对象per documentation 的类/模式。
import os
import pickle
import tempfile
import datetime
from copy import copy
class Model:
def __init__(self, identifier):
self.identifier = identifier
self.creation_date = datetime.datetime.now()
def __repr__(self):
return '{0} created on {1}'.format(self.identifier, self.creation_date)
identifier = 'identifier'
model1 = Model(identifier)
model2 = copy(model1)
with tempfile.TemporaryDirectory() as directory:
with open(os.path.join(directory, identifier), 'wb') as f:
# persist model and delete from RAM
pickle.dump(model2, f)
del model2
with open(os.path.join(directory, identifier), 'rb') as f:
print('is model stale: {}'.format(repr(model1) != repr(f)))
print('Disk model: {}'.format(repr(f)))
print('RAM model: {}'.format(repr(model1)))
我想返回model2 的字符串表示形式(即identifier created on <creation_date>),而不将model2 实际加载到内存中。
请分享您可能用于实现类似目的的另一种解决方法。
谢谢。
- MacOS
- Python 3.6.4
【问题讨论】:
-
不,没有办法。
-
这怎么可能行得通?
__repr__方法需要访问对象的属性,如果对象没有加载到内存中,它应该从哪里获取它们? -
您不能在文件名中嵌入
identifier/creation_date信息吗? -
好主意@ekhumoro。在我们的过程中,我们希望避免在模型名称本身上有时间戳。
-
@sedeh。或者使用包含泡菜的非压缩存档(例如tar)以及包含相关信息的小文件。
标签: python string python-3.x pickle repr