Покрытие для однострочного заявления - PullRequest
1 голос
/ 26 марта 2020

Stati c анализаторы кода для Python не генерируют ответвления в следующем случае (однострочный, если). Это по замыслу? Даже coverage дает 100% покрытие, даже если проверяется только один случай.

x = 1 if q == 0 else 10

Может кто-нибудь, пожалуйста, пролить свет на это?

1 Ответ

1 голос
/ 26 марта 2020

Первый комментарий гласит: «не создает управляющую структуру». Я не знаю, что это значит. Будь то одна строка или несколько строк, скомпилированный байт-код практически одинаков:

>>> 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

...