2016-04-22 3 views
0

Я это:Python встроенный условный конкатенации

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

Поскольку иногда тзд уже байт, я хотел Concat 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' 

Но это не работает, как я ожидал, так как в настоящее время msg equals msg. (время + уровень журнала не добавляется).

Должен ли я делать, если/else вместо этого?

+0

Что вы ожидали и что он сделал? –

+0

@AmitGold concat msg.encode ('utf-8') или msg в зависимости от того, был ли он уже байтами. – JorgeeFG

+0

вместо одного из 'msg' s, измените его на нечто подобное, как '_msg', а затем выполните' msg = _msg' –

ответ

3

Условное выражение имеет 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' 

Рассмотрите возможность использования утка-ввод (тест для 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)