代码之家  ›  专栏  ›  技术社区  ›  wds

在Python2.6中打印一堆实例属性的优雅方法?

  •  0
  • wds  · 技术社区  · 16 年前

    首先是一些背景知识。我正在解析一个简单的文件格式,并希望稍后在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__ .

    所以我的问题有两个:

    • 我需要实施吗 __获取项目__ 如果是的话怎么办?
    • 有没有一种更优雅的方法来处理这样的事情,您只需要输出一堆您已经知道名称的属性?
    2 回复  |  直到 16 年前
        1
  •  2
  •   Ned Batchelder    16 年前
    class MyRecord:
        #....  
        def __getitem__(self, key):
            return getattr(self, key)
    
        2
  •  2
  •   FogleBird    16 年前

    如果您将attr1的长度作为record类的属性或属性(因此您实际上只是按照标题所示打印实例属性),那么您可以这样做。

    attrs = ['id', 'attr1', 'attr1_len', ...]
    print '\t'.join(getattr(record, attr) for attr in attrs)