在python中使用格式(** locals())插入值之前操纵值

时间:2014-05-02 09:22:22

标签: python format locals

在使用** locals()的.format()中使用它之前是否可以操作局部变量而不创建新变量?所以具有与此相同效果的东西:

medium="image"
size_name="double"
width=200
height=100
width2=width*2
height2=height*2
print "A {size_name} sized {medium} is {width2} by {height2}".format(**locals())

但更优雅,没有创建width2和height2变量。我试过这个:

medium="image"
size_name="double"
width=200
height=100
print "A {size_name} sized {medium} is {width2} by {height2}".format(**locals(),height2=height*2,width2=width*2)

但它在locals()之后的第一个逗号处抛出错误“SyntaxError:invalid syntax”。

1 个答案:

答案 0 :(得分:1)

只需更改顺序:

print "A {size_name} sized {medium} is {width2} by {height2}".format(height2=height*2,width2=width*2,**locals())

明星论点总是在正常论点之后。

为了使这个答案不那么简单,这就是我在标准曲目中所拥有的:

import string

def f(s, *args, **kwargs):
    """Kinda "variable interpolation". NB: cpython-specific!"""
    frame = sys._getframe(1)
    d = {}
    d.update(frame.f_globals)
    d.update(frame.f_locals)    
    d.update(kwargs)
    return string.Formatter().vformat(s, args, d)    

它可以应用于您的示例:

 print f("A {size_name} sized {medium} is {0} by {1}", width*2, height*2)

本地(和全局)变量自动传递,表达式使用数字占位符。