Python 3.x 使用eval()编写时是否应该使用f-string

Python 3.x 使用eval()编写时是否应该使用f-string,python-3.x,eval,f-string,Python 3.x,Eval,F String,因此,最近我了解到eval()是一个令人惊讶的函数,它可以将字符串转换为代码命令,在编写参数是函数名字符串的函数时,它可能非常有用 但我想知道还有什么更像蟒蛇的使用方式。 例如: 我试着用f-string来写,它可以工作: print(eval(f'{a}' + '.' + b + f'({target})')) # >>> 3 令我惊讶的是,即使我不使用f-string,它也能工作: print(eval('a' + '.' + b + '(target)')) # &

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

但我想知道还有什么更像蟒蛇的使用方式。 例如:

我试着用f-string来写,它可以工作:

print(eval(f'{a}' + '.' + b + f'({target})'))  # >>> 3
令我惊讶的是,即使我不使用f-string,它也能工作:

print(eval('a' + '.' + b + '(target)'))  # >>> 3
这对我来说是一个小问题,因为如果没有f-string,“a”可能会让人困惑,很难判断这是一个字符串还是一个假装为字符串的变量

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


谢谢

正如人们在评论中提到的,(亚历山大·赫斯扎格),几乎没有必要

然而,你似乎有一个问题

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

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

使用a、b和目标的值,它们的计算结果均为:
”[1,2,3,1,2,3,4,1,2,5,6,7]。计数(2)

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

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

'{a}.{b}({target})'.format(a=a, b=b, target=target)
这使得
.format
版本更具可读性,但非常冗长

随着f字符串的引入,我们现在在
{}
中包含表达式,类似于
.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})

永远不要使用eval,因为eval更像Pythonic。如果字符串来自可信输入,那么就没有理由使用eval:只需编写代码。如果字符串部分或全部来自不受信任的输入,即使您尝试限制eval,您的计算机也可能被完全擦除。不要用eval@AlexanderHuszagh那么,如果函数的参数是字符串形式的函数名,那么最好的编写方法是什么呢?假设可以使用10个函数名,那么我不想编写10个“如果”条件,对吗?您可以非常轻松地使用字典映射和查找
f=[map,reduce]
g={i.\uu name\uuuu:i代表f中的i}
。公平地说,eval有一些用途,但您必须确保提供给它的每个字符串都是完全可信的。简单得多的方法是将其最小化到几乎从不。如果您想对Python文本使用
eval
,可以非常安全地从
ast
模块中使用
literal\u eval
。但是很多Python程序员认为
eval
是邪恶的,这是有原因的。尽可能不要使用它。
f'{a}.{b}({target})'
f'{a}' + '.' + b + f'({target})'