format 格式化输出,最容易忽略的坑!

本贴最后更新于 318 天前,其中的信息可能已经时移世改

课题:format 格式化输出,最容易忽略的坑!

近期有同学在使用 format 格式化字符串的时候遇到了一个问题,这个问题也是大家在使用 format 的过程中非常容易踩的坑,问题代码如下:

代码:

image.png

image.png

错误:

image.png

一、format 的基本使用

正式踩坑之前,我们先来回顾一下 format 方法的使用,了解过 python 的同学,大家都知道字符串的 format 是用来格式化字符串的。

那么何为格式化呢?

格式化简单来说就是将字符串按照设定的格式进行输出,

# 当前有一段个人描述的文字,格式如下:
desc = "个人描述:我的名字叫XXX,年龄XX,擅长的技能是XXX"

使用 format 将个人信息按以上方式输出,

format 格式化:方式一:
#在字符串中使用{}进行占位,然后再通过format中对占位数据进行填充,字符串中有几个{},后面的format就需要填充几条数据,按位置进行传递,format中的的第一个值,传给字符串中的第一个{},第二个传给第二个,依次类推。
desc = "我的名字叫{},年龄{},擅长的技能是{}".format('MuSen','18','python')
print(desc)

# 运行结果:
'我的名字叫MuSen,年龄18,擅长的技能是python'
format 格式化:方式二:
# 在{},可以通过下标位置来指定接收format传入的值

desc = "我的名字叫{1},年龄{2},擅长的技能是{0}".format('python''MuSen','18',)
print(desc)

# 运行结果:
'我的名字叫MuSen,年龄18,擅长的技能是python'
format 格式化:方式三:
# 在{}通过指定参数名,来接收format传入的值

desc = "我的名字叫{name},年龄{age},擅长的技能是{sikll}".format(
    skill='python'name='MuSen',age='18',)
print(desc)

# 运行结果:
'我的名字叫MuSen,年龄18,擅长的技能是python'

二、容易忽略的坑

代码思考一:此处格式化后 func 的值是什么?
a = 10
func = 'get_data({})'.format(a)
答案:func = 'get_data(10)'

对于这个问答 99.9% 的通过都能回答出来正确的结果,那么接下来看下一段代码

代码思考二:此处格式化后 func 的值是什么?
def add():
    print('this is add')
  
func = 'get_data({})'.format(add)
答案:'get_data(<function add at 0x001F0810>)'

对于这个段代码很多同学,想都不想就回答 func = 'get_data(add)',那么实际上不是却这个结果,

format 原理剖析:

format 在做格式化输出的时候,对传入的数据类型没有限制,意味着你在 format 中传入的数据可以是任意类型,但是 format 在进行格式化的时候,是获取的格式化对象的 __repr__ 方法所返回的字符串内容,进行格式化,上面案例中我们在 format 中传入 add 是一个函数,那么函数对象的 __repr__ 返回的就是上述大家所看到的该函数描述信息 <function add at 0x001F0810>。

注意点:不只是函数,基本的数据类型以外的对象,使用 format 格式化的时候,都是按这种方式来输出的,大家在使用 format 做格式化的时候,一定要注意这个点!

代码思考三:可不可以通过 eval()执行格式化之后的函数 get_data(xxx)
def get_data(fun):
    fun()

def add():
    print('this is add')
  
func = 'get_data({})'.format(add)
# 使用eval能不能执行这个函数?
eval(func)

当执行上面代码的时候,那么就会遇到文章开头提到的那个错误。那么如何解决这个问题?

解决方案如下

def get_data(fun):
    fun()
  
def add():
    print('this is add')
  
# 格式化的时候将函数名加个引号,变成字符串。
func = 'get_data({})'.format('add')

# 格式化的结果为
func= 'get_data(add)'

# 此时使用eval就可以正常执行了
eval('get_data(add)')
1 操作
nmb_musen 在 2020-08-06 17:53:01 更新了该帖
3 回帖
请输入回帖内容 ...
  • jomer3126

    一条网线连接四面八方,敲打键盘帅气的模样,“蜗居”生活胸怀天下,编一套快乐的程序,让世界欢畅,程序员日愿程序员朋友好好休息,身体健康,“不着病毒”,祝福你们明天再次创造辉煌。2109

  • 其他回帖
  • test123

    文章通俗易懂,内容很有用

  • jomer3126

    一条网线连接四面八方,敲打键盘帅气的模样,“蜗居”生活胸怀天下,编一套快乐的程序,让世界欢畅,程序员日愿程序员朋友好好休息,身体健康,“不着病毒”,祝福你们明天再次创造辉煌。5536