首页 > 解决方案 > 实际使用 Radon 来处理 Python 的复杂性(在 Python 中)

问题描述

我有一个项目需要对 python 应用程序进行一些分析。

我想使用包'Radon'来查看一些python代码(作为字符串)并得到一个表示代码复杂性的数字。在文档中,有这个例子:

>>> from radon.visitors import ComplexityVisitor
>>> v = ComplexityVisitor.from_code('''
def factorial(n):
    if n < 2: return 1
    return n * factorial(n - 1)

def foo(bar):
    return sum(i for i in range(bar ** 2) if bar % i)
''')
>>> v.functions
[Function(name='factorial', lineno=2, col_offset=0, endline=4, is_method=False,
classname=None, closures=[], complexity=2),
Function(name='foo', lineno=6, col_offset=0, endline=7, is_method=False, classname=None,
closures=[], complexity=3)] 

好的,所以这给出了这两个函数的列表,并为这两个函数返回了一堆指标。我想只输入一些代码,并获得一切的复杂性。这个视图是通过访问给出的v.functions,所以我想我应该能够调用v.complexity

v = ComplexityVisitor.from_code('''
def factorial(n):
    if n < 2: return 1
    return n * factorial(n - 1)

def foo(bar):
    return sum(i for i in range(bar ** 2) if bar % i)
''')

print(v.complexity)

但是当我运行它时,我得到的复杂度为 1?这真的很奇怪,之前函数的复杂度是2和3,现在累积的复杂度怎么会是1呢?

无论我输入哪个代码,它都保持为 1。例如,此代码的复杂度也为 1:

def complexcode(x):
      
    n = order(x)
    temp = x
    sum1 = 0
    tmp = [1,2,3,4,5,6,3,1,3,5]
    while (temp != 0):
        for i in tmp:
            if i == 10:
                return
            print(i)
        r = temp % 10
        sum1 = sum1 + power(r, n)
        temp = temp // 10
  
    # If condition satisfies
    return (sum1 == x)

如何获得整个代码块的复杂性?

编辑:

我现在玩得更多,发现问题在于函数和驱动程序代码的复杂性是分开计算的。但问题几乎仍然存在。如何获得所有代码的复杂性?不是单独的功能和驱动代码分开吗?

标签: pythonabstract-syntax-treestatic-analysis

解决方案


推荐阅读