Первый комментарий гласит: «не создает управляющую структуру». Я не знаю, что это значит. Будь то одна строка или несколько строк, скомпилированный байт-код практически одинаков:
>>> import dis
>>> def one_line():
... x = 1 if q == 0 else 10
...
>>> dis.dis(one_line)
2 0 LOAD_GLOBAL 0 (q)
2 LOAD_CONST 1 (0)
4 COMPARE_OP 2 (==)
6 POP_JUMP_IF_FALSE 12
8 LOAD_CONST 2 (1)
10 JUMP_FORWARD 2 (to 14)
>> 12 LOAD_CONST 3 (10)
>> 14 STORE_FAST 0 (x)
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
>>> def multi_line():
... if q == 0:
... x = 1
... else:
... x = 10
...
>>> dis.dis(multi_line)
2 0 LOAD_GLOBAL 0 (q)
2 LOAD_CONST 1 (0)
4 COMPARE_OP 2 (==)
6 POP_JUMP_IF_FALSE 14
3 8 LOAD_CONST 2 (1)
10 STORE_FAST 0 (x)
12 JUMP_FORWARD 4 (to 18)
5 >> 14 LOAD_CONST 3 (10)
16 STORE_FAST 0 (x)
>> 18 LOAD_CONST 0 (None)
20 RETURN_VALUE
>>>
Причина. 1010 * использует, чтобы сообщить cover.py, что происходит. Функция трассировки вызывается для каждой выполняемой строки. Функция трассировки не получает события в строке.
Более полное обсуждение возможных способов улучшить это здесь: https://github.com/nedbat/coveragepy/issues/509