【问题标题】:Python : Typeerror : Non-empty format string passed to object.__format__Python:Typeerror:传递给 object.__format__ 的非空格式字符串
【发布时间】:2015-06-19 06:09:15
【问题描述】:

我知道有人问过这个问题here,但该解决方案对我不起作用。我正在使用python 3.4

我的脚本中有以下格式:

print ( "\t {0:20} {1:<11} {2:<25} {3:11} {4:11} {5:>32}".format( files.name.split('/')[-1], sizeof_fmt(files.size),
                                                                          str( formatted_timestamp ), files.owner,
                                                                          files.version_id, files.etag ))

这适用于 python 2.7.x。但是在3.4 我得到了错误:

File "test.py", line 3, in file_print
      versionid, etag ))
TypeError: non-empty format string passed to object.__format__

我试过了:

print ( "\t {0:20} {1:<11} {2:<25} {3:11} {!s4:11s} {!s5:>32s}".format( files.name.split('/')[-1], sizeof_fmt(files.size),
                                                                          str( formatted_timestamp ), files.owner,
                                                                          files.version_id, files.etag ))

但我仍然遇到同样的错误。我什至将versionidetag 转换为字符串并最终得到相同的错误。谁能给我解释一下?

Etag 看起来像这样9893532233caff98cd083a116b013c0b,versionid 是None

【问题讨论】:

  • 尝试缩小范围。从format 调用中一一删除参数,直到您不再收到错误为止。开发MCVE 是解决问题的第一步。
  • 想解释一下否决票?我已经承认了类似的问题
  • 我没有投反对票,但其他人可能会因为您的代码生成NameError: name 'files' is not defined 而不是TypeError 而感到恼火。如果不提供我们可以复制-粘贴-运行的代码,它会给人一种印象,就是您没有半途而废。
  • 转化发生在字段名之后; {!s4:11s} 无效,只有 {4!s:11s}

标签: python python-3.4


【解决方案1】:

您的参数之一是没有自己的__format__() 方法的类型,因此使用object.__format__()

object.__format__() 不支持任何格式选项,包括字段宽度和对齐方式,这就是您收到错误的原因。

首先转换为字符串应该会有所帮助,但您确实需要将转换放在字段名称之后;而不是{!s4:11s} 使用{4!s:11s} 等:

print ( "\t {0:20} {1:<11} {2:<25} {3:11} {4!s:11s} {5!s:>32s}".format(
    files.name.split('/')[-1], sizeof_fmt(files.size),                                                                           
    str(formatted_timestamp), files.owner,
    files.version_id, files.etag))

【讨论】:

  • 这行得通。我可以发誓我尝试在字段名称之后进行强制字符串转换,但可能我没有。我还是不明白这一点。我虽然.format 只是对齐和打印的一种“智能”方式。 .format 是否意味着传递给它的每个对象都有自己的 .format 被调用?
  • @newkid101:是的,格式化委托给对象的__format__ 方法。
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 2019-09-21
  • 2017-04-04
  • 2017-12-30
  • 2021-10-31
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多