所以最近我了解到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'可能会令人困惑,如果这只是一个字符串或假装成字符串的变量,就不容易分辨。
不确定你们怎么想这个?对你来说哪一个更蟒蛇?
谢谢!
答案 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})'