Jor*_*eFG 2 python conditional-expressions
我有这个:
msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg.encode('utf-8') + b'\n'
Run Code Online (Sandbox Code Playgroud)
由于有时 msg 已经是字节,如果它是字符串或者只是 msg,我想连接 msg.encode('utf-8'),所以我这样做了:
msg = time + b' - ' + Logger.LEVELS_WORD[msg_loglevel] + b': ' + msg if isinstance(msg, bytes) else msg.encode('utf-8') + b'\n'
Run Code Online (Sandbox Code Playgroud)
但它并没有像我预期的那样工作,因为现在msg equals msg。(时间 + 日志级别没有被添加)。
我应该做 if/else 吗?
条件表达式的优先级非常低;它只在 a 之前最后执行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'
Run Code Online (Sandbox Code Playgroud)
考虑使用鸭子类型(测试hasattr(msg, 'encode')),并将表达式分解为多行以提高可读性。如果您使用的是 Python 3.5 或更新版本,也许您想使用printf-style 格式:
if hasattr(msg, 'encode'):
msg = msg.encode('utf-8')
msg = b'%s - %s: %s\n' % (time, Logger.LEVELS_WORD[msg_loglevel], msg)
Run Code Online (Sandbox Code Playgroud)