print(f"...:")-语句太长 - 将其分成多行而不会弄乱格式

print(f"...:")-statement too long - break it into multiple lines without messing up the format

我有一个带有格式化输出的控制台程序。为了始终获得相同长度的打印输出,我有一个相当复杂的格式化打印输出。

print(f"\n{WHITE_BG}{64*'-'}")
print(f"\nDirektvergleich{9*' '}{RED}{players[0].name}{4*' '}{GREEN}vs.{4*' '}{RED}{players[1].name}{CLEAR}\n")
print(f"""{15*'~'}{' '}{YELLOW}Gesamt{CLEAR}:{' '}{players[0].name}{' '}{GREEN}{int(player1_direct_wins)}{(int(4-len(player1_direct_wins)))*' '}-{(int(4-len(player1_direct_losses)))*' '}{int(player1_direct_losses)}{CLEAR}{' '}{players[1].name}{' '}{(28-len(players[0].name)-len(players[1].name))*'~'}\n""")
print(f"""{15*'~'}{' '}{YELLOW}Trend{CLEAR}:{'  '}{players[0].name}{' '}{GREEN}{int(player1_trend_wins)}{(int(4-len(player1_trend_wins)))*' '}-{(int(4-len(player1_trend_losses)))*' '}{int(player1_trend_losses)}{CLEAR}{' '}{players[1].name}{' '}{(28-len(players[0].name)-len(players[1].name))*'~'}""")    
print(f"\n{WHITE_BG}{64*'-'}")

这会在我的 windows cmd

中产生以下输出

出于可读性目的,我尝试在多行上打印,因此我在 Whosebug 上找到了以三重引号开头的想法。但是当我在中间剪切这个 print(f"...") 语句时,我弄乱了我的格式。

示例:

print(f"\n{WHITE_BG}{64*'-'}") #als String einspeisen?!
print(f"\nDirektvergleich{9*' '}{RED}{players[0].name}{4*' '}{GREEN}vs.{4*' '}{RED}{players[1].name}{CLEAR}\n")
print(f"""{15*'~'}{' '}{YELLOW}Gesamt{CLEAR}:{' '}{players[0].name}{' '}{GREEN}{int(player1_direct_wins)}{(int(4-len(player1_direct_wins)))*' '}-
    {(int(4-len(player1_direct_losses)))*' '}{int(player1_direct_losses)}{CLEAR}{' '}{players[1].name}{' '}{(28-len(players[0].name)-len(players[1].name))*'~'}\n""")
print(f"""{15*'~'}{' '}{YELLOW}Trend{CLEAR}:{'  '}{players[0].name}{' '}{GREEN}{int(player1_trend_wins)}{(int(4-len(player1_trend_wins)))*' '}-
    {(int(4-len(player1_trend_losses)))*' '}{int(player1_trend_losses)}{CLEAR}{' '}{players[1].name}{' '}{(28-len(players[0].name)-len(players[1].name))*'~'}""")       
print(f"\n{WHITE_BG}{64*'-'}")

导致...

任何人都可以指出正确的方向如何以显示的方式格式化我的输出,但没有这种荒谬的长行长度。

提前谢谢大家!

三重引号字符串保留换行符,因此它们确实不是您想要的。现在,当它找到两个相邻的字符串时,Python 解析器会自动将它们连接成一个字符串,即:

s = "foo" "bar"

相当于

s = "foobar"

如果您将字符串放在括号内,这将起作用:

s = ("foo" "bar")

在这种情况下,您也可以将每个字符串放在自己的行中:

s = (
    "foo"
    "bar"
    )

这也适用于 "fstrings" 所以你想要的是这样的:

print((
    f"{15*'~'}{' '}{YELLOW}Gesamt{CLEAR}:{' '}{players[0].name}{' '}{GREEN} " 
    f"{int(player1_direct_wins)}{(int(4-len(player1_direct_wins)))*' '}-"
    f"{(int(4-len(player1_direct_losses)))*' '}{int(player1_direct_losses)}"
    f"{CLEAR}{' '}{players[1].name}{' '}{(28-len(players[0].name)-"
    f"len(players[1].name))*'~'}\n"
    ))

也就是说,我宁愿使用中间变量,也不愿尝试将如此复杂的表达式塞进 fstring。