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



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

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 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-"

结果还包含分隔符-(在这种情况下,分隔符可以是任何字符/字符串(,我希望是x:y

我可以复制模式,使其具有一个包含所有3个可用变量的集合,以及一组单独的模式,用于最后一个变量为空字符串时,并与if else条件或仅条件相结合来解决它。

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

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

我会做一些稍微不同的事情。我不认为只指定两个模式是个问题,我认为这会使事情变得更加可配置。关键是不必更改格式的工作方式。

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 = ("{}:{}-{}", "{}:{}")

如果你需要在没有If的情况下完成,那么有条件地添加第三个格式部分:

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

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

最新更新