如何将getattr与dict字符串格式结合使用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (80)

我有一个数据结构类和一个表格式类,其中我想格式化一个文件并输出它。如果需要更改输出,我希望动态创建格式化程序的灵活性。

class Row(object):
    __slots__ = ('date', 'item', 'expiration', 'price')
    def __init__(self, date, item, expiration, price=None):
        self.date = date
        self.item = item
        self.expiration = expiration
        self.price = ""

        if price:
            self.price = price

class Formatter(object):
    def row(self, rowdata):
        for item in rowdata:
            print('<obj date="{date}" item="{item}" exp="{expiration}" price="{price}" />\n').format(**item)


def print_table(objects, colnames, formatter):
    for obj in objects:
        rowdata = [str(getattr(obj, colname)) for colname in colnames]
        formatter.row(rowdata)

我是这样说的:

data = [Row("20180101", "Apples", "20180201", 1.50),
         Row("20180101", "Pears", "20180201", 1.25)]

formatter = Formatter()
print_table(data, ['date','item','expiration','price'], formatter)

我期待看到的是:

<obj date="20180101" item="Apples" exp="20180201" price="1.50" /> <obj date="20180101" item="Pears" exp="20180201" price="1.25" />

我目前正在收到以下错误:TypeError: format() argument after ** must be a mapping, not str

有人能帮忙吗?

提问于
用户回答回答于

固定代码:

class Formatter(object):
    def row(self, rowdata):
        print('<obj date="{date}" item="{item}" exp="{expiration}" price="{price}" />\n'.format(**rowdata))


def print_table(objects, colnames, formatter):
    for obj in objects:
        rowdata = {colname: str(getattr(obj, colname)) for colname in colnames}
        formatter.row(rowdata)

你有3个问题:

  1. 你将rowdata视为项列表,而rowdata应该是列名和数据之间的单个映射
  2. 你没有创建映射,只有结果。{colname: str(getattr(obj, colname)) for colname in colnames}在名称和属性之间创建映射。然后你可以把它传递给它.format(),它将完全奏效。
  3. 你用过format()这个print()功能。你应该在里面的字符串上使用它。
用户回答回答于

**item是无效的,因为**运算符期望命名变量是字典,你还没有提供(Item是字符串)。因此,你需要转换item在“格式”语句中具有适当的键/值对的字典。

所属标签

可能回答问题的人

  • 嗨喽你好

    7 粉丝480 提问8 回答
  • uncle_light

    5 粉丝518 提问7 回答
  • Richel

    4 粉丝0 提问6 回答
  • 人生的旅途

    10 粉丝484 提问6 回答

扫码关注云+社区

领取腾讯云代金券