Реализация Python программного обеспечения ABC:
Джерри Фицпатрик введен в 1997 году, чтобы преодолеть недостатки программного обеспечения ABC, чтобы преодолеть недостатки LOC. Метрика определяет оценку ABC как триплета значений, которые представляют размер набора операторов исходного кода. Оценка ABC рассчитывается путем подсчета количества назначений (A), количества ветвей (B) и количества условий (C) в программе. Оценка ABC может быть применена к отдельным методам, функциям, классам, модулям или файлам в рамках программы.
Оригинальная статья Фицпатрика на момент написания написания доступна только через машину Wayback, поэтому его копия также включена в это репо.
В документе перечислены правила подсчета для C, C ++ и Java, поэтому вот правила, которые использует репо для Python:
else , elif , except .assert без условного оператора. Установите требования в выбранной виртуальной среде, тогда вы можете увидеть доступные аргументы командной строки:
$ python -m python_abc --help
usage: python_abc [-h] [--debug DEBUG] [--sort SORT] [--verbose VERBOSE] path
A python implementation of the ABC Software metric: https://en.wikipedia.org/wiki/ABC_Software_Metric
positional arguments:
path path to directory or file
optional arguments:
-h, --help show this help message and exit
--debug DEBUG display AST output for each element in the parsed tree
--sort SORT sort files from highest to lowest magnitude
--verbose VERBOSE display marked-up file Заданный file.py , который содержит следующий текст:
if a and b :
print ( a )
else :
print ( b )
a = sum ( i for i in range ( 1000 ) if i % 3 == 0 and i % 5 == 0 )
def f ( n ):
def inner ( n ):
return n ** 2
if n == 0 :
return 1
elif n == 1 :
return n
elif n < 5 :
return ( n - 1 ) ** 2
return n * pow ( inner ( n ), f ( n - 1 ), n - 3 )Вы можете получить вывод Barebones следующим образом:
$ python -m python_abc /path/to/file.py
/path/to/file.py < 1, 7, 10> (12.2) Передача verbose флага даст более подробную информацию:
$ python -m python_abc file.py --verbose=true
cc | if a and b:
b | print(a)
c | else:
b | print(b)
|
abbcc | a = sum(i for i in range(1000) if i % 3 == 0 and i % 5 == 0)
|
| def f(n):
| def inner(n):
| return n ** 2
c | if n == 0:
| return 1
cc | elif n == 1:
| return n
cc | elif n < 5:
| return (n - 1) ** 2
bbb | return n * pow(inner(n), f(n - 1), n - 3)
file.py < 1, 7, 10> (12.2) Если вы хотите проверить абстрактное синтаксисное дерево на наличие файла, вы можете пройти флаг debug , который выводит каждый узел из дерева и вектор, который возник из него.
Аргумент path также может быть путем к каталогу, sort в этом случае будут отсканированы все файлы Python в этом каталоге (и его подзадачи). величина:
$ python -m python_abc . --sort
./calculate.py < 18, 56, 23> (63.2)
./vector.py < 12, 23, 11> (28.2)
./main.py < 10, 23, 8> (26.3)
./tests/test_vector.py < 4, 19, 10> (21.8)
./tests/__init__.py < 4, 12, 1> (12.7)
./tests/test_radon_test_cases.py < 1, 2, 1> (2.4)
./tests/test_calculate_condition.py < 1, 2, 1> (2.4)
./tests/test_calculate_empty.py < 1, 2, 1> (2.4)
./tests/test_calculate_assignment.py < 1, 2, 1> (2.4)
./tests/test_calculate_branch.py < 1, 2, 1> (2.4) Наконец, вы можете передать аргумент cores , чтобы рассказать библиотеке, сколько ядер ЦП использовать. По умолчанию библиотека попытается использовать все ядра, доступные на вашей машине.