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

同时,我想将数据加载到旧数据库中,加载程序文件采用简单的选项卡分隔格式。最直接的方法就是做类似的事情:

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

因为有很多列要打印出来,所以我想我会使用 Template 课程使您更容易看到什么,即:

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

我认为我可以只使用记录代替A substitute 呼叫,带有一些派生值的其他关键字:

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

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

所以我的问题是双重的:

  • 我需要实施吗 __getitem__ 如果是这样,怎么样?
  • 是否需要更优雅的方式,您只需要输出一堆您已经知道名称的属性?
有帮助吗?

解决方案

class MyRecord:
    #....  
    def __getitem__(self, key):
        return getattr(self, key)

其他提示

如果将attr1的长度作为记录类的属性或属性(因此您实际上只是按照标题所暗示的打印实例属性),则可以做到这一点。

attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top