如果最后一个变量是空字符串,则调整字符串的格式模式

Adapt the formating pattern of a string if the last variable is an empty string

我有一个 class,它有多个字符串模式作为 class 属性。 这些模式稍后用于创建字符串。

class Main:

 pattern_for_a = "{} {} {}"
 pattern_for_b = "{} {}-{}"
 pattern_for_c = "{}-{} {}"
......................

 def do_a(*args, **kwargs):
   ............
   c = pattern_for_a.format(a1,a2,r)

这个 class 有多个子class,在某些情况下会覆盖 patterns.Ex:

class B(Main):

 pattern_for_a = "{}:{} {}"
 pattern_for_b = "{}-{}{}"
 pattern_for_c = "{}{} {}"

当所有 3 个变量都具有实际值时,这很有效。但有些情况下,当 最后一个变量是空字符串。在这种特殊情况下,还需要删除分隔符。

示例:

pattern_for_a = "{}:{}-{}"
a="x" b="y" c="z"
Result: "x:y-z"
pattern_for_a = "{}:{}-{}"
a="x" b="y" c=""
Result: "x:y-"

结果还包含分隔符-(在这种情况下,分隔符可以是任何char/string),我想是x:y

我可以复制这些模式以获得一个包含所有 3 个可用变量的集合,以及一组单独的模式用于当最后一个变量只是空字符串并结合 if else 条件或仅条件来解决它.

但是因为我有多个模式,需要在多个地方检查,所以我认为这个解决方案不是最优的。

我正在寻找一种不使用重复模式和许多 ifs 的解决方案来解决它。需要在 python2.7 和 3.*.

中工作

如果需要不用if的话,有条件的加上第三个格式部分:

a=123
b=456
c=""
pattern_for_a = "{}:{}"+(c!="")*"-{}"
print(pattern_for_a.format(a,b,c))

如果 c 为空,则字符串乘数将为 0,否则为 1

我会做一些稍微不同的事情。我认为仅指定两种模式不是问题,而且我认为它使事情更易于配置。关键是不必更改格式的工作方式。

class Main:
    _pattern_a = ("{}:{} {}", "{}:{}")

    def pattern_for(self, name, a, b, c=None):
        long, short = getattr(self, f"_pattern_{name}")
        if c is None:
            return short.format(a, b)
        return long.format(a, b, c)

class B(Main):
    _pattern_a = ("{}:{}-{}", "{}:{}")