用eval()写时我应该使用f-string

时间:2017-12-20 03:06:36

标签: python-3.x

所以最近我了解到eval()是一个令人惊讶的函数,可以将字符串转换为代码命令,在编写函数时,它可能非常有用,其中参数是函数名称的字符串。 / p>

但是我想知道什么是使用它的pythonic方式。 例如:

map

我尝试用f-string编写,它可以工作:

a = [1,2,3,1,2,3,4,1,2,5,6,7]
b = 'count'
target = 2
# regular way
print(a.count(target))  # >>> 3

令我感到惊讶的是,即使我不使用f-string,它也会有效:

print(eval(f'{a}' + '.' + b + f'({target})'))  # >>> 3

这对我来说现在有点质疑,因为没有f-string,' a'可能会令人困惑,如果这只是一个字符串或假装成字符串的变量,就不容易分辨。

不确定你们怎么想这个?对你来说哪一个更蟒蛇?

谢谢!

1 个答案:

答案 0 :(得分:1)

正如人们在评论中所提到的,eval is dangerous(亚历山大·胡萨(Alexander Huszagh))很少需要。

但是,您似乎对f-strings有疑问。

在3.6之前,有两种构造字符串的方法:

'a' + '.' + b + '(target)'

'{}.{}({})'.format(a, b, target)

使用a,b和target的值,它们都将得出:'[1,2,3,1,2,3,4,1,2,5,6,7].count(2)'

当您有多个变量时,第一个选项会出现加号和引号,而第二个选项则存在可读性问题;哪一组{}与哪个变量(或表达式)匹配。

第二种方法的一种变体是将名称放入{}中,并以以下格式引用这些名称:

'{a}.{b}({target})'.format(a=a, b=b, target=target)

这使.format版本更具可读性,但非常冗长。

通过引入f字符串,我们现在在{}中包含表达式,类似于.format的命名版本,但没有.format(...)部分:

f'{a}.{b}({target})'

F字符串对+.format版本的可读性和可维护性都有明显的改进。

虽然技术上正确,但您使用f弦的方式并不刻板:

f'{a}' + '.' + b + f'({target})'

似乎您基本上是在使用f'{a}'来代替str(a)

总而言之,f'{a}' + '.' + b + f'({target})'可以简化为f'{a}.{b}({target})'