1

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

但我想知道使用它的更 Pythonic 方式是什么。例子:

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,它也会起作用:

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

这对我来说有点疑问,因为没有 f-string,'a' 可能会令人困惑,很难判断这只是一个字符串还是伪装成字符串的变量。

不知道大家怎么看这个?哪一个对你来说更蟒蛇?

谢谢!

4

1 回答 1

1

正如人们在评论中提到的那样,eval 很危险(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-strings 的引入,我们现在在 中包含表达式{},类似于 的命名版本.format,但没有.format(...)部分:

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

+F-strings 在可读性和.format可维护性方面对两者都有明显的改进。

您使用 f 字符串的方式虽然在技术上是正确的,但不是 pytonic:

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

看来您基本上f'{a}'是在使用str(a).

概括起来,f'{a}' + '.' + b + f'({target})'可以简化为f'{a}.{b}({target})'

于 2019-12-19T02:51:10.373 回答