python3的formatter_python中的formatter的详细用法

今天抽空学习了一下python中的string service中的formatter的相关用法,主要是为了让自己的代码看起来更加和谐,因为很多java或者c语言过来的开发者都不怎么爱使用python的原生的字符串格式化工具,似乎大家都爱用下面的格式化工具

info = 'my name is %s I really enjoy %s' % ('younger', 'python')

现在我要学习使用更加python化的字符串格式化风格。

python的buildin字符串服务模块 [string](file:///Users/youngershen-mac-book-pro/Downloads/python-2.7.8-docs-html/library/string.html) 本身提供了一些字符串操作的工具类方法,其中包括一些经常会使用到的常量,和比较复杂的Formatter类,Template类,这里我要重点学习的就是string.Formatter类

[string.Formatter](file:///Users/youngershen-mac-book-pro/Downloads/python-2.7.8-docs-html/library/string.html#string-formatting)类中的方法:

format(format_string, *args, **kwargs)

format方法是string.Formatter类中的主要方法,它的参数是一个你需要去格式化的目标字符串,和一组需要去填充目标字符串的序列,比如字典和元组,format方法是对vformat方法的封装。

上面是我照文档的说明写的,其实Formatter.format方法和str.format并没有什么不同,他们的语法是通用的,只要学会一种就都会了,哪个更方便就用哪个

vformat(format_string, args, kwargs)

parse(format_string)

get_field(field_name, args, kwargs)

get_value(key, args, kwargs)

上面的这几个方法是互相调用的,所以一放在一起研究,其中Formatter.format 最终调用的是Formatter.vformat方法,测试程序如下

class Person(object):

name = 'default name'

def __init__(self, name = ''):

self.name = name

me = Person('younger')

data = [me]

s = "my name is {person[0].name:^30}"

formatter = String.Formatter()

formatter.format(s, data)

输出结果:

>>> formatter.format(s, person = data)

'my name is younger '

现在用Formatter.vformat方法

formatter.vformat(s, (), {'person' : data})

输出结果:

>>> formatter.format(s, person = data)

'my name is younger '

2个方法的结果是完全一样的,只是一个包装了另一个,再Formatter.vformat方法中必须有4个参数,中间的空元组和最后的空字典必须存在,因为Formatter.vformat的参数不是 (*args, **kwargs) 而是 (args, kwargs), 这是完全不一样的,没看清楚会悲剧的。

现在继续说上面4个方法的调用顺序, get_value调用了get_field, get_field调用parse, vformat调用了 get_value, 一般情况下我们只需要调用format就足够了,上面的4个方法都是给需要继承Formatter创建自己的格式化语法的时候来覆盖掉的,不过我们可以从这4个方法分析出很多东西。

我现在执行下面的程序

for i, v in enumerate(formatter.parse(s, start = 0)):

print i, v

结果会输出:

0 ('my name is ', 'person[0].name', '^30', None)

上面是返回的第1个编号为0的元组, 这4个值分别是

(literal_text, field_name, format_spec, conversion)

我们没有canversion, 所以第4项是None, 你也可以写上一个!r或者!s

这样的话字符串就变成了

s = "my name is {person[0].name!r:^30}"

前两项都很好理解,直接看字面就懂什么意思,第三项的意思是说格式化的时候的站位符,我这里用的是空,你也可以用星号,现在把s变成这样

s ="my name is {person[0].name!r:*^30}"

输出的结果是:

"my name is **********'younger'***********"

*号充当了占位符的作用

现在执行下面的程序:

for i ,v in enumerate(formatter.parse(s)):

temp = v

formatter.get_field(temp[1], (), {'person' : data})

输出结果为:

('younger', 'person')

用文档中的话来说就是 'object'和'used_key', 这个key和get_value中的key是相同的所以要调用get_value必须先调用get_field

下面继续执行代码

ret = formatter.get_value(formatter.get_field(temp[1], (), {'person':data})[1], (), {'person':data})

这个返回的 ret就是得到的对象,一个Person类型的list ,里面只有一个对象就是最初我们填充的那个,到此为止 , 所有的方法都跑了一遍,如果我们要改写自己的format语法,那就直接继承这个类,覆盖这么几个方法就行了,其余的2个方法很容易理解,可以直接看文档。

Formatter.format的语法

这里就不采用文档里的论道的方法来说明了,直接以我的理解来说好了

只有keyword类型的format string

最简单的:

"my name is {name}".format(name = 'younger')

带有多个组合条件的

"my name is {person[0].name!r:*^30}".format(person = data_list)

上面的意思是说传入的是一个list,list中有person, keyword是person[0].name, 很好理解,就是第0个对象的name属性, 这样用起来很方便, 非常好记, 从!r开始的奇怪语法是 Format Specification Mini-Language , 其中对一些数据类型,比如百分数,正负数, 复数, 大数,时间,小数点的位数,以及格式化format string的站位符等进行了定义,用法都和我写的例子一样,没有什么复杂的,这里例子已经算是比较复杂的例子了。

只有position类型的format string

"my name is {0.name}".format(person)

同时有position和keyword的formart string

"my name is {0.name}, I am living at {area[0].city}".format(person, area_list)

这里要注意的就是position的必须写再前面,不然是不能使用的,推荐大家一个格式化字符串里只用以个方式去写。

Python中logging模块的基本用法

在 PyCon 2018 上,Mario Corchero 介绍了在开发过程中如何更方便轻松地记录日志的流程. 整个演讲的内容包括: 为什么日志记录非常重要 日志记录的流程是怎样的 怎样来进行日志记录 ...

【转】java.util.vector中的vector的详细用法

[转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

简单说明Python中的装饰器的用法

简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

Python中【__all__】的用法

Python中[__all__]的用法 转:http://python-china.org/t/725 用 __all__ 暴露接口 Python 可以在模块级别暴露接口: __all__ = [&q ...

python中enumerate()函数用法

python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...

Python中try...except...else的用法

Python中try...except...else的用法: try:    except :              #如果在try ...

(转)Python中的split()函数的用法

Python中的split()函数的用法 原文:https://www.cnblogs.com/hjhsysu/p/5700347.html Python中有split()和os.path.split ...

Python中zip()与zip(*)的用法

目录 Python中zip()与zip(*)的用法 zip() 知识点来自leetcode最长公共前缀 Python中zip()与zip(*)的用法 可以看成是zip()为压缩,zip(*)是解压 z ...

python中的随机函数random的用法示例

python中的随机函数random的用法示例 一.random模块简介 Python标准库中的random函数,可以生成随机浮点数.整数.字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据 ...

随机推荐

Python09作业思路及源码:高级FTP服务器开发(仅供参考)

高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...

iOS GCD学习笔记

// 后台执行: dispatch_async(dispatch_get_global_queue(, ), ^{ // something }); // 主线程执行: dispatch_async( ...

ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节

主要代码,一定要继续System.Configuration.ConfigurationSection,具体的节点名称可以自行修改 using System; using System.Data; u ...

C++实现双缓冲

首先声明下,这篇资料也是整理别人的资料的基础上,总结来的. 在图形图像处理过程中,双缓冲技术是一种比较常见的技术.窗体在响应WM_PAINT消息时,需要对图像进行绘制处理.如果图像绘制次数过多,重绘过 ...

django 学习-15 .Django文件上传(用户注册)

1.vim blog/views.py from django.shortcuts  import  render_to_responsefrom django.http   import HttpR ...

MySql数据库学习笔记(2)

DELETE 语法:delete from 表名 [where condition] delete from grade; TRUNCATE 用于完全清空表数据,但表结构.索引.约束不变: 语法: t ...

call_user_func 和 call_user_func_array用法

说明 call_user_func 和 call_user_func_array 相同:都可以调用函数和类内部的函数,不同:不同的是传递的参数不同,前者是一个参数一个参数传递, 后者是传递array参 ...

linux环境下,对于一个大文件,如何查看其中某行的内容

需求说明: 今天在做mysql数据导入的过程中,导入到最后有一个报错,报某张表不存在.然后就想看看这行到底是在做什么操作的时候报的错误. 报错信息: [mysql@host---- ~]$ cat n ...

sencha touch 压缩js,css遇到的问题

在使用工具压缩css和jss时,我遇到了以下问题 1. showBtn: { tap: function (t, value) { this.redirectTo(t.config.goto); } ...

NodeJS 难点(网络,文件)的 核心 stream 三:readable ?

什么是可读流 可读流    常见  读取磁盘文件.读取网络请求内容等,看一下前面介绍什么是流用的例子: const rs = fs.createReadStream(filePath); 我们常见的控 ...

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值