所以最近我了解到eval()是一个令人惊讶的函数,它可以将字符串转换为代码命令,当编写一个参数是函数名称的字符串的函数时,它可能非常有用。
但我想知道使用它的更具蟒蛇色彩的方式是什么。示例:
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‘可能会令人困惑,很难区分这是一个字符串还是一个伪装成字符串的变量。
不知道你们是怎么想的?哪一个对你来说更像蟒蛇?
谢谢!
发布于 2019-12-19 10:51:10
正如人们在评论中提到的那样,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})'与+和.format版本相比,F字符串在可读性和可维护性方面都有了明显的改进。
你使用f-string的方式,虽然在技术上是正确的,但并不是pytonic:
f'{a}' + '.' + b + f'({target})'看起来你基本上是在用f'{a}'作为str(a)的替代品。
总之,可以将f'{a}' + '.' + b + f'({target})'简化为f'{a}.{b}({target})'
https://stackoverflow.com/questions/47898221
复制相似问题