Python inline условно в конкатенации строк
У меня было это:
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
, (время + уровень журнала не добавляется).
Должен ли я сделать, если / иначе вместо этого?
1 ответ
Условное выражение имеет очень низкий приоритет; он выполняется последним только перед 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
стиль форматирования:
if hasattr(msg, 'encode'):
msg = msg.encode('utf-8')
msg = b'%s - %s: %s\n' % (time, Logger.LEVELS_WORD[msg_loglevel], msg)