Python:将方法分割调用为多行

时间:2015-08-07 09:19:56

标签: python

在JavaScript中我可以做类似的事情:

var template = "{a}{b}-{c}{d}";
var myStuff = template
                .replace("{a}", a)
                .replace("{b}", b)
                .replace("{c}", c)
                .replace("{d}", d);

我想在python中做类似的事情,但由于python使用缩进代码块,我不能简单地写:

myStuff = template
                .replace("{a}", a)
                .replace("{b}", b)
                .replace("{c}", c)
                .replace("{d}", d)

我不想写这个:

myStuff = template.replace("{a}", a).replace("{b}", b).replace("{c}", c).replace("{d}", d)

或者这个:

myStuff = template
myStuff = myStuff.replace("{a}", a)
myStuff = myStuff.replace("{b}", b)
myStuff = myStuff.replace("{c}", c)
myStuff = myStuff.replace("{d}", d)

他们看起来都很丑陋(我不喜欢我的代码丑陋!) 有没有办法在python中将方法调用链分解为新行?就像我在JavaScript中一样?

3 个答案:

答案 0 :(得分:8)

一般来说,你唯一的希望是使用线加入。您始终可以使用显式行连接

myStuff = template \
            .replace("{a}", a) \
            .replace("{b}", b) \
            .replace("{c}", c) \
            .replace("{d}", d)

要使用隐式线连接,您必须在某处放置括号(隐式线连接是指在paretheses,括号或括号内有某些内容 - 如果分成几行,则标识不会生效)。例如

 myStuff = (template.replace("{a}", a)
            .replace("{b}", b)
            .replace("{c}", c)
            .replace("{d}", d))

当然,您可以找到针对特定情况的特殊解决方案,例如在您的示例中使用字符串格式:

 myStuff = template.format(a=a, b=b, c=c, d=d)

但是,如果您尝试完全替换其他内容(如果发生abcd,也不会失败是一个别的东西而不是一个字符串)。

答案 1 :(得分:4)

您可以使用\打破一行:

s = s.replace('a', 'x')\
      .replace('b', 'y')\
      .replace('c', 'z')

或者您可以创建一个接受旧值和新值字典的泛型函数,用for循环替换它们并返回新字符串。

答案 2 :(得分:4)

其他答案可以帮助您了解如何将语句拆分为多行,但实现您正在做的事情的更简单方法是使用str.format() -

>>> template = "{a}{b}-{c}{d}"
>>> a = 1
>>> b = 2
>>> c = 3
>>> d = 4
>>> template.format(**{'a':a,'b':b,'c':c,'d':d})
'12-34'
>>> template.format(a=a,b=b,c=c,d=d)
'12-34'

第一个str.format()将字典解包为函数format()的关键字参数(类似于第二个函数直接执行的操作)。

此外,您可以将参数拆分为多行中的函数调用,而无需使用\,例如 -

>>> template.format(a=a,
...                 b=b,
...                 c=c,
...                 d=d)
'12-34'