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)
Другие вопросы по тегам