首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用eval()编写代码时,是否应该使用f-string

在使用eval()编写代码时,是否应该使用f-string
EN

Stack Overflow用户
提问于 2017-12-20 11:06:36
回答 1查看 357关注 0票数 1

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

但我想知道使用它的更具蟒蛇色彩的方式是什么。示例:

代码语言:javascript
复制
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来写,这是可行的:

代码语言:javascript
复制
print(eval(f'{a}' + '.' + b + f'({target})'))  # >>> 3

令我惊讶的是,即使我不使用f-string,它也能正常工作:

代码语言:javascript
复制
print(eval('a' + '.' + b + '(target)'))  # >>> 3

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

不知道你们是怎么想的?哪一个对你来说更像蟒蛇?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-12-19 10:51:10

正如人们在评论中提到的那样,eval is dangerous (Alexander Huszagh)很少是必要的。

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

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

代码语言:javascript
复制
'a' + '.' + b + '(target)'

代码语言:javascript
复制
'{}.{}({})'.format(a, b, target)

使用a、b和target的值,它们的计算结果都是:'[1,2,3,1,2,3,4,1,2,5,6,7].count(2)'

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

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

代码语言:javascript
复制
'{a}.{b}({target})'.format(a=a, b=b, target=target)

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

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

代码语言:javascript
复制
f'{a}.{b}({target})'

+.format版本相比,F字符串在可读性和可维护性方面都有了明显的改进。

你使用f-string的方式,虽然在技术上是正确的,但并不是pytonic:

代码语言:javascript
复制
f'{a}' + '.' + b + f'({target})'

看起来你基本上是在用f'{a}'作为str(a)的替代品。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47898221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档