【问题标题】:Get the string representation of an object without loading the object into memory在不将对象加载到内存的情况下获取对象的字符串表示
【发布时间】: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


【解决方案1】:

如果您将对象序列化为 JSON 而不是二进制 .pickle,则可以直接操作或过滤文本而无需反序列化它。请参阅 How to make a class JSON serializable 获取一些不错的示例(尤其是 jsonpickle 和 .toJSON 答案)。

【讨论】:

    【解决方案2】:

    多年前我写了一个懒惰的pickle loader here。你可以腌制一个((id, creation_date), model),然后反序列化第一个元组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 2014-09-15
      • 1970-01-01
      • 2010-11-03
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多