我想像这个问题一样打印出键+值对,

key a:         1

key ab:        2

key abc:       3

^ this colon is what I want

但是我不喜欢那里的答案,我试图像这样子化string.Formatter:

from __future__ import print_function

from string import Formatter

class KeyFormatter(Formatter):

def parse(self, fmtstr):

res = super(KeyFormatter, self).parse(fmtstr)

#for r in res:

#    print(r)

return res

kf = KeyFormatter()

w = 10

x = dict(a=1, ab=2, abc=3)

for k in sorted(x):

v = x[k]

print(kf.format('key {::

我想调试分析以查看是否可以在格式字符串中插入额外的" :",但这会引发

KeyError:""

在Python 2.7和3.4中。 如果我取消对for循环的注释,以查看错误消失了,但是最终的print语句仅显示换行符。

当我进入最后一行时:

print('key {:

这有效(在键后面有空格),当我这样做时:

print('key {::

我得到多个':'而不是空格。 但是没有KeyError。

为什么得到KeyError? 我该如何调试?

您实际希望的输出是什么? 第二个冒号的意义是什么?

@jonrsharpe我想我链接到的另一个问题很清楚,您看到了吗? 无论如何,我包括了预期的输出。

否-问题应该是独立的。 如果您只想在键后加一个冒号,为什么不在键后而不是格式模板中加一个冒号呢? 即 key {:

@jonrsharpe这样您就不会得到我想要的输出(多余的空格在:之前)

正确,现在我明白了-为什么不分两个步骤进行操作,即构建"key abc:",然后将其左对齐添加到适当的位置。

您可以将:放在format的"右侧":"...".format(k +":", ...)

@tobias_k就是我所提到的问题中所建议的内容,并且没有解释我所询问的KeyError问题,只能解决它。

感谢您提出问题,这也使我的问题得到了解答:)

这里有两个有点相关的问题,如何调试的简单答案是:您不能(至少不能使用print语句),或者使用字符串格式化本身不能进行任何操作,因为这在另一种字符串格式期间发生并破坏了格式化程序的状态。

它引发错误是由于string.Formatter()不支持空字段这一事实引起的,这是从2.6到3.1(和2.7)格式的附加内容,该格式在C代码中,但未反映在string模块。

您可以通过将类MyFormatter子类化来模拟新行为:

from __future__ import print_function

from string import Formatter

import sys

w = 10

x = dict(a=1, ab=2, abc=3)

if sys.version_info < (3,):

int_type = (int, long)

else:

int_type = (int)

class MyFormatter(Formatter):

def vformat(self, *args):

self._automatic = None

return super(MyFormatter, self).vformat(*args)

def get_value(self, key, args, kwargs):

if key == '':

if self._automatic is None:

self._automatic = 0

elif self._automatic == -1:

raise ValueError("cannot switch from manual field specification"

"to automatic field numbering")

key = self._automatic

self._automatic += 1

elif isinstance(key, int_type):

if self._automatic is None:

self._automatic = -1

elif self._automatic != -1:

raise ValueError("cannot switch from automatic field numbering"

"to manual field specification")

return super(MyFormatter, self).get_value(key, args, kwargs)

应该摆脱KeyError。之后,您应该覆盖方法format_field而不是parse:

if sys.version_info < (3,):

string_type = basestring

else:

string_type = str

class TrailingFormatter(MyFormatter):

def format_field(self, value, spec):

if isinstance(value, string_type) and len(spec) > 1 and spec[0] == 't':

value += spec[1]  # append the extra character

spec = spec[2:]

return super(TrailingFormatter, self).format_field(value, spec)

kf = TrailingFormatter()

w = 10

for k in sorted(x):

v = x[k]

print(kf.format('key {:t:

并得到:

key a:         1

key ab:        2

key abc:       3

请注意格式说明符(t),该说明符在格式字符串中引入了结尾字符。

Python格式化例程实际上足够聪明,可以让您像宽度格式一样在字符串中插入尾随字符:

print(kf.format('key {:t{}

给出相同的结果,并允许您动态更改':'

您还可以将format_field更改为:

def format_field(self, value, spec):

if len(spec) > 1 and spec[0] == 't':

value = str(value) + spec[1]  # append the extra character

spec = spec[2:]

return super(TrailingFormatter, self).format_field(value, spec)

并提交任何类型:

print(kf.format('key {:t{}

要得到:

key (1, 2)@    3

但是由于在将值传递给Formatter.formatfield()之前将其转换为字符串,如果str(val)获得的值与使用{0}.format(val)和/或仅包含在t:之后的选项不同,则可能会得到不同的结果非字符串类型(例如+和-)

这仅适用于字符串吗? 不是整数键吗? 我要尝试这个。

@Carl我明确测试了字符串,您可以将其省略并执行value = string(value) + spec[1],但有一些副作用,我将以此来更新我的答案。

这行得通,谢谢。 我试图将spec [1]附加到super ... formatfield的返回值上,但是在空格后面放了:哦。 这是图书馆的一部分吗?

不,它不在库中,但我可以将其放在PyPI的ruamel.std.string中

在Python 3.4中仔细检查string.py时,Formatter()方法允许在其中使用空的{}。

python3中format函数 出现keyerror_关于python:string.Formatter抛出KeyError”相关推荐

  1. python3中format函数列表_Python3之字符串格式化format函数详解(上)

    173.jpg 概述 在Python3中,字符串格式化操作通过format()方法或者f'string'实现.而相比于老版的字符串格式化方式,format()方法拥有更多的功能,操作起来更加方便,可读 ...

  2. format函数python的顺序_[转载] Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

  3. jq设置保留两位小数_如何实现python中format函数保留指定位数的小数?

    我们经常说我国人口有13亿,这13亿数字是一个近似数.在我们无法精确准确得到一个数字时,会选择是它的近似数.近似数即经过四舍五入.进一法或者去尾法等方法得到的一个与原始数据相差不大的一个数.之前小编向 ...

  4. python3中zip函数_用python实现矩阵转置,python3 中zip()函数

    前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...

  5. python中的format什么意思中文-python中format函数什么意思

    python中format函数什么意思? Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % ...

  6. python中format函数

    python中format函数用于字符串的格式化 通过关键字 1. print('{name}在{option}'.format(name="谢某人",option="写 ...

  7. Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

  8. python中format函数作用_python中format函数什么意思

    python中format函数什么意思? Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % ...

  9. python中format函数作用_Python代码中format函数具有哪些功能呢?

    摘要: 下文讲述Python代码中format函数的功能说明,如下所示: format函数功能说明 format函数功能: 用于格式化字符串 format函数语法: format采用{} 和 : 来代 ...

最新文章

  1. 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
  2. android 事件拦截 (Viewpager不可以左右滑动)
  3. from torch._C import * ImportError: DLL load failed: 找不到指定的模块。
  4. c语言输入r1 r2垫片的面积,2011学生C语言上机实验
  5. java基础集合类之set
  6. db文件怎么修改_MongoDB最新4.2.7版本三分片集群修改IP实操演练
  7. linux 搭建testlink的问题总结
  8. Hadoop权威指南读书笔记(2) — Yarn简介及Capacity Fair Scheduler
  9. 快速搭建一个端对端加密的在线聊天室
  10. 3dmax:3dmax的软件中右边工具栏的创建、修改、层次、运动、显示、几何体的粒子系统、工具、灯光、摄影、空间扭曲、系统、实用程序、辅助对象等使用技巧之详细攻略
  11. 牛顿迭代法求一元三次方程c语言,C++一元三次方程求解算法 - 小众知识
  12. 【Windows】安装openslide遇到的问题及解决办法
  13. 2016团体程序设计天梯赛-决赛-部分题解
  14. OpenFOAM-v2112安装——很详细
  15. 求最大公因数的两种方法(高效方法)
  16. 计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文
  17. 正则表达式从入门到摸鱼(本文内容过长,先给阿姨来一杯卡布奇诺再阅读)
  18. js组件化、模块化开发
  19. lerna 生成自定义日志changelog
  20. ”真相是否只有一个?”麻省理工学院带你数据可视化分析假新闻

热门文章

  1. 基于计算的蛋白质复合物预测方法综述
  2. 中国MEMS陀螺仪应用及市场需求空间测算研究报告
  3. 一图说明如何修改VisualStudio工程的配置管理器界面宽度
  4. 计算机体系结构基础引言
  5. 从苏宁电器到卡巴斯基第09篇:我在苏宁电器当营业员 I
  6. android videoview样式,VideoView上的android透明WebView
  7. Vue 3的企业级项目开发开篇词|为何掌握了技术API,依然在项目中处处掣肘?
  8. React 实现计时器
  9. 了不起的外设 | AidLux小课堂
  10. 医疗机器人与手术:人工智能如何改变医疗手术方式