Python 字符串连接中的内联条件
Python inline conditional in string concatenation
我有这个:
msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg.encode('utf-8') + b'\n'
因为有时 msg 已经是字节,我想连接 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 吗?
一个条件表达式有一个very low precedence;它仅在 lambda
之前最后执行。因此,如所写,表达式在 time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg
或 msg.encode('utf-8')) + b'\n'
.
之间选择
将带有 if
和 else
分支的条件表达式放在括号中:
msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + (
msg if isinstance(msg, bytes) else msg.encode('utf-8')) + b'\n'
考虑使用 duck-typing(测试 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)
我有这个:
msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg.encode('utf-8') + b'\n'
因为有时 msg 已经是字节,我想连接 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 吗?
一个条件表达式有一个very low precedence;它仅在 lambda
之前最后执行。因此,如所写,表达式在 time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg
或 msg.encode('utf-8')) + b'\n'
.
将带有 if
和 else
分支的条件表达式放在括号中:
msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + (
msg if isinstance(msg, bytes) else msg.encode('utf-8')) + b'\n'
考虑使用 duck-typing(测试 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)