python3中format函数 出现keyerror_关于python:string.Formatter抛出KeyError”
我想像这个问题一样打印出键+值对,
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”相关推荐
- python3中format函数列表_Python3之字符串格式化format函数详解(上)
173.jpg 概述 在Python3中,字符串格式化操作通过format()方法或者f'string'实现.而相比于老版的字符串格式化方式,format()方法拥有更多的功能,操作起来更加方便,可读 ...
- format函数python的顺序_[转载] Python中format函数用法
Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...
- jq设置保留两位小数_如何实现python中format函数保留指定位数的小数?
我们经常说我国人口有13亿,这13亿数字是一个近似数.在我们无法精确准确得到一个数字时,会选择是它的近似数.近似数即经过四舍五入.进一法或者去尾法等方法得到的一个与原始数据相差不大的一个数.之前小编向 ...
- python3中zip函数_用python实现矩阵转置,python3 中zip()函数
前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...
- python中的format什么意思中文-python中format函数什么意思
python中format函数什么意思? Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % ...
- python中format函数
python中format函数用于字符串的格式化 通过关键字 1. print('{name}在{option}'.format(name="谢某人",option="写 ...
- Python中format函数用法
Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...
- python中format函数作用_python中format函数什么意思
python中format函数什么意思? Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % ...
- python中format函数作用_Python代码中format函数具有哪些功能呢?
摘要: 下文讲述Python代码中format函数的功能说明,如下所示: format函数功能说明 format函数功能: 用于格式化字符串 format函数语法: format采用{} 和 : 来代 ...
最新文章
- 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
- android 事件拦截 (Viewpager不可以左右滑动)
- from torch._C import * ImportError: DLL load failed: 找不到指定的模块。
- c语言输入r1 r2垫片的面积,2011学生C语言上机实验
- java基础集合类之set
- db文件怎么修改_MongoDB最新4.2.7版本三分片集群修改IP实操演练
- linux 搭建testlink的问题总结
- Hadoop权威指南读书笔记(2) — Yarn简介及Capacity Fair Scheduler
- 快速搭建一个端对端加密的在线聊天室
- 3dmax:3dmax的软件中右边工具栏的创建、修改、层次、运动、显示、几何体的粒子系统、工具、灯光、摄影、空间扭曲、系统、实用程序、辅助对象等使用技巧之详细攻略
- 牛顿迭代法求一元三次方程c语言,C++一元三次方程求解算法 - 小众知识
- 【Windows】安装openslide遇到的问题及解决办法
- 2016团体程序设计天梯赛-决赛-部分题解
- OpenFOAM-v2112安装——很详细
- 求最大公因数的两种方法(高效方法)
- 计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文
- 正则表达式从入门到摸鱼(本文内容过长,先给阿姨来一杯卡布奇诺再阅读)
- js组件化、模块化开发
- lerna 生成自定义日志changelog
- ”真相是否只有一个?”麻省理工学院带你数据可视化分析假新闻