最近有人告诉我,我们可以在Python中打印变量,就像Perl一样。
而不是:
print("%s, %s, %s" % (foo, bar, baz))
我们可以做到:
print("%(foo)s, %(bar)s, %(baz)s" % locals())
在Python中打印变量的方式是不是像我们在Perl中那样?我认为第二个解决方案实际上看起来非常好并且使代码更具可读性,但是那里的locals()会让它看起来像是一种令人费解的方式。
答案 0 :(得分:10)
唯一的另一种方法是使用Python 2.6 + / 3.x .format()
方法进行字符串格式化:
# dict must be passed by reference to .format()
print("{foo}, {bar}, {baz}").format(**locals())
或按名称引用特定变量:
# Python 2.6
print("{0}, {1}, {2}").format(foo, bar, baz)
# Python 2.7/3.1+
print("{}, {}, {}").format(foo, bar, baz)
答案 1 :(得分:5)
使用% locals()
或.format(**locals())
并不总是一个好主意。例如,如果从本地化数据库中提取字符串或者可能包含用户输入,则可能存在安全风险,并且它会混合程序逻辑和转换,因为您必须处理程序中使用的字符串。
一个好的解决方法是限制可用的字符串。例如,我有一个程序可以保存有关文件的一些信息。所有数据实体都有这样的字典:
myfile.info = {'name': "My Verbose File Name",
'source': "My Verbose File Source" }
然后,当文件是进程时,我可以这样做:
for current_file in files:
print 'Processing "{name}" (from: {source}) ...'.format(**currentfile.info)
# ...
答案 2 :(得分:2)
我自己更喜欢.format()
方法,但您可以随时执行:
age = 99
name = "bobby"
print name, "is", age, "years old"
制作:bobby is 99 years old
。注意隐式空格。
或者,你可以变得非常讨厌:
def p(*args):
print "".join(str(x) for x in args))
p(name, " is ", age, " years old")
答案 3 :(得分:1)
答案是,不,Python中的字符串语法不包含Perl(或Ruby)样式的变量替换。使用… % locals()
就像你要获得的一样光滑。
答案 4 :(得分:0)
从Python 3.6开始,你可以得到你想要的东西。
>>> name = "world"
>>> print(f'hello {name}')
hello world
不是前缀f