0

首先是一些背景。我正在解析一个简单的文件格式,并希望稍后在 python 代码中重新使用结果,所以我制作了一个非常简单的类层次结构并编写了解析器来从我正在处理的文本文件中的原始记录构造对象.

同时,我想将数据加载到遗留数据库中,加载器文件采用简单的制表符分隔格式。最直接的方法是执行以下操作:

print "{0}\t{1}\t....".format(record.id, record.attr1, len(record.attr1), ...)

因为有很多列要打印出来,我想我会使用这个Template类来更容易看到什么是什么,即:

templ = Template("$id\t$attr1\t$attr1_len\t...")

而且我想我可以使用记录代替substitute调用使用的地图,并为派生值添加一些额外的关键字:

print templ.substitute(record, attr1_len=len(record.attr1), ...)

不幸的是,这失败了,抱怨记录实例没有属性__getitem__

所以我的问题是双重的:

  • 我需要实施__getitem__吗?如果需要,如何实施?
  • 有没有更优雅的方式来处理这样的事情,您只需要输出一堆您已经知道名称的属性?
4

2 回答 2

2
class MyRecord:
    #....  
    def __getitem__(self, key):
        return getattr(self, key)
于 2010-06-08T12:00:01.820 回答
2

如果您将 attr1 的长度设置为记录类的属性或属性(所以您实际上只是在打印实例属性,正如标题所暗示的那样),您可以这样做。

attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)
于 2010-06-08T12:10:32.150 回答