【问题标题】:Python inline conditional in string concatenation字符串连接中的Python内联条件
【发布时间】:2016-04-22 13:54:58
【问题描述】:

我有这个:

msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg.encode('utf-8') + b'\n'

由于有时 msg 已经是字节,我想 concat msg.encode('utf-8') 如果它是字符串或者只是 msg,所以我这样做了:

msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg if isinstance(msg, bytes) else msg.encode('utf-8') + b'\n'

但它并没有像我预期的那样工作,因为现在msg equals msg。 (未添加时间 + 日志级别)。

我应该改用 if/else 吗?

【问题讨论】:

  • 你期待什么,它做了什么?
  • @AmitGold concat msg.encode('utf-8') 或 msg 取决于它是否已经是字节。
  • 而不是 msgs 之一,将其更改为类似 _msg 的内容,然后执行 msg = _msg
  • 您在提供的答案中所述的问题是优先级,if 是在表达式之前取整。所以你需要在你的条件中使用括号 (msg if isinstance(msg, bytes) else msg.encode('utf-8'))

标签: python conditional-expressions


【解决方案1】:

条件表达式有一个very low precedence;它仅在lambda 之前最后执行。因此,所写的表达式在time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msgmsg.encode('utf-8')) + b'\n' 之间进行选择。

将带有ifelse 分支的条件表达式放在括号中:

msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + (
    msg if isinstance(msg, bytes) else msg.encode('utf-8')) + b'\n'

考虑使用鸭式打字(测试hasattr(msg, 'encode')),并将表达式分成多行以提高可读性。如果您使用的是 Python 3.5 或更高版本,也许您想使用printf-style formatting

if hasattr(msg, 'encode'):
    msg = msg.encode('utf-8')
msg = b'%s - %s: %s\n' % (time, Logger.LEVELS_WORD[msg_loglevel], msg)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2019-04-04
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多