我有一个类,它有多个字符串模式作为类属性。这些模式稍后用于创建字符串。
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。