【问题标题】:print(f"...:")-statement too long - break it into multiple lines without messing up the formatprint(f"...:")-statement too long - 把它分成多行而不弄乱格式
【发布时间】:2018-08-23 11:33:17
【问题描述】:

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

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 中的以下输出

为了便于阅读,我尝试在多行上打印,因此我在 stackoverflow 上发现了以三引号开头的想法。但是当我在中间剪切这个 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*'-'}")

导致...

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

提前谢谢你们!

【问题讨论】:

    标签: string python-3.x string-formatting


    【解决方案1】:

    三重引号字符串保留换行符,因此它们确实不是您想要的。现在,当它找到两个相邻的字符串时,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 中。

    【讨论】:

    • 谢谢,这成功了!如果您谈论中间变量,您是指将f"{15*'~'}{' '}{YELLOW}Gesamt{CLEAR}:{' '}{players[0].name}{' '}{GREEN} " 之类的内容放入变量中,然后将它们连接到最终打印输出中吗?
    • 不,我的意思是在 fstring 之外进行所有计算,例如 int(4-len(player1_direct_wins))(将结果分配给中间变量),因此 fstring 只包含对变量的引用,而不包含复杂的表达式。这将使您的代码更具可读性和可维护性(也可能更易于测试)。
    • 好的,知道了。为这个小程序还有一件事要做:-) 再次感谢您!
    • 感谢@toby-speight 修复了我的拼写错误。
    猜你喜欢
    • 1970-01-01
    • 2016-06-06
    • 2011-01-31
    • 2017-02-25
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多