用Python打印变量的非Python方式?

用Python打印变量的非Python方式?,python,Python,最近有人向我演示了我们可以像Perl那样用Python打印变量 而不是: print("%s, %s, %s" % (foo, bar, baz)) 我们可以做到: print("%(foo)s, %(bar)s, %(baz)s" % locals()) 有没有一种不像Perl那样在Python中打印变量的方式?我认为第二种解决方案实际上看起来非常好,使代码更具可读性,但是挂在那里的locals()使它看起来像是一种复杂的方法。唯一的另一种方法是使用Python 2.6+/3.x方法进行字

最近有人向我演示了我们可以像Perl那样用Python打印变量

而不是:

print("%s, %s, %s" % (foo, bar, baz))
我们可以做到:

print("%(foo)s, %(bar)s, %(baz)s" % locals())

有没有一种不像Perl那样在Python中打印变量的方式?我认为第二种解决方案实际上看起来非常好,使代码更具可读性,但是挂在那里的locals()使它看起来像是一种复杂的方法。

唯一的另一种方法是使用Python 2.6+/3.x方法进行字符串格式化:

# 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)    
我自己更喜欢
.format()
方法,但您始终可以这样做:

age = 99
name = "bobby"
print name, "is", age, "years old"
生产:
bobby已经99岁了
。注意隐式空格

或者,你可能会变得非常讨厌:

def p(*args):
    print "".join(str(x) for x in args))

p(name, " is ", age, " years old")

答案是,不,Python中字符串的语法不包括Perl(或者Ruby)风格的变量替换。使用
..%locals()
是一个非常灵活的方法。

使用
%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)
    # ...

自从Python3.6以来,您可以得到您想要的东西

>>> name = "world"
>>> print(f'hello {name}')
hello world

注意上面的字符串前缀
f

看起来非常接近。。。(没有对答案的认可,我还没有读过)您已经说过,本质上,您希望Python更像Perl。Perl的哪个方面?格式化字符串的方法不止一种,我们可以直接在引号中引用变量来格式化字符串,而不必在引号外格式化。我只是发现,当你不必在引号外阅读时,字符串的可读性要高得多。流量没有中断(想不出更好的方式来描述它了..呃)@Greg:你在说什么?他说的正是他想要的。这并不能让它看起来更干净。只是在直接引用变量时添加了特定的变量。在我看来,2.7/3.1+版本绝对是最干净的版本。很好,直到你开始从本地化数据库中提取字符串为止。此时,您必须返回到使用显式排序,因为不同的语言喜欢不同的值顺序。(真的。)您可以使用
vars()
而不是
locals()
。另外
vars(obj)
要使用
obj.\uuu dict\uuuu
进行替换,您会怎么做?(令人讨厌的部分)@sharvey,这个问题是在问unpythonic.+1这是一个很好的观点。不知道为什么有人会投反对票。是的,请参阅,以获得关于为什么显式优于隐式的深入讨论。正是在这种情况下。