콜 그래프 그리기


12

파이썬으로 작성된 오래된 코드베이스를 유지하고 있습니다. 특히 모듈에서 다른 함수를 호출하는 다른 모듈에서 다른 함수를 호출하는 복잡한 코드가 있습니다. OOP가 아니라 기능과 모듈입니다.
주 함수를 호출 할 때마다 흐름이 시작되고 끝나는 위치를 추적하려고했지만 하위 호출에서 길을 잃기 때문에 이것을 그릴 필요가 있다고 생각합니다.

나에게 중요한 것은 각 함수가 본문 내에서 여러 외부 함수를 호출하여 작업을 완료하고 값을 호출자에게 반환한다는 것입니다.

이것을 어떻게 그릴 수 있습니까? 이런 종류의 행동 / 코드를 문서화하는 데 어떤 종류의 차트 / 그래픽이 적합합니까?

따라서 UML 다이어그램을 그리는 것이 플로 차트도 유용하지 않다고 생각합니다. 콜 그래프?


doxygen-호출 / 호출자 그래프를 생성합니다. 파이썬에 대해 얼마나 많은 지원이 있는지 잘 모르겠습니다. 파이썬 코드를 문서화 할 수 있다는 것을 알고 있습니다.
— gbjbaanb

나는 pycallgraph를 시도했지만 그것을 사용하기에는 너무 복잡하거나 너무 깊습니다. 이것은 평범한 파이썬과 django를 혼합하고 API URL에 대한 외부 호출을 혼합하기 때문에 코드가 복잡하기 때문입니다. 그렇기 때문에 필요한 관련 부분 만 고려하여 손으로 직접 그렸습니다. 문제는 시스템을 완전히 이해하기 위해 어떤 종류의 그래프를 사용해야하는지 모른다는 것입니다
— Leonardo

5
이것이 당신이 그것을 이해하는 데 도움이된다면, 자연스럽게 오는 것을 그립니다. 공식적인 문서를 작성하는 경우 언제든지 나중에 정리할 수 있습니다.
— jonrsharpe

답변:


9

나는 당신이 찾고있는 것이 시퀀스 다이어그램 이라고 생각합니다 . 이를 통해 화살표를 사용하여 다양한 모듈이 서로 호출하는 순서를 시각화 할 수 있습니다.

하나를 만드는 것은 간단합니다.

  1. 아래에 점선으로 시작 수업을 그립니다.
  2. 콜 트레이스에 다음 클래스 / 방법을 그 아래에 점선으로 그립니다.
  3. 마지막으로 그린 ​​화살표 아래에 수직으로 위치한 화살표로 선을 연결하십시오.
  4. 추적의 모든 통화에 대해 2-3 단계를 반복하십시오.

예

시퀀스 다이어그램을 만들고자하는 다음 코드가 있다고 가정 해 봅시다.

def long_division(quotient, divisor):
    solution = ""
    remainder = quotient
    working = ""
    while len(remainder) > 0:
        working += remainder[0]
        remainder = remainder[1:]
        multiplier = find_largest_fit(working, divisor)
        solution += multiplier
        working = calculate_remainder(working, multiplier, divisor)
    print solution


def calculate_remainder(working, multiplier, divisor):
    cur_len = len(working)
    int_rem = int(working) - (int(multiplier) * int (divisor))
    return "%*d" % (cur_len, int_rem)


def find_largest_fit(quotient, divisor):
    if int(divisor) == 0:
        return "0"
    i = 0
    while i <= 10:
        if (int(divisor) * i) > int(quotient):
            return str(i - 1)
        else:
            i += 1


if __name__ == "__main__":
    long_division("645", "5")

가장 먼저 그릴 것은 main메소드에 연결 하는 진입 점 ( ) long_division입니다. 이렇게하면 long_division에 상자가 만들어져 메소드 호출의 범위를 나타냅니다. 이 간단한 예제의 경우 상자가 이것이 유일한 실행이라는 사실 때문에 시퀀스 다이어그램의 전체 높이가됩니다.

여기에 이미지 설명을 입력하십시오

이제 우리는 find_largest_fit근무 번호에 맞는 가장 큰 배수를 찾아서 우리에게 돌려줍니다. 우리는에서 선을 그릴 long_division에 find_largest_fit함수 호출에 대한 범위를 의미하는 또 다른 상자. 승수가 반환 될 때 상자가 어떻게 끝나는 지주의하십시오. 이것이 그 기능 범위의 끝입니다!

여기에 이미지 설명을 입력하십시오

더 큰 숫자를 몇 번 반복하면 차트는 다음과 같아야합니다.

여기에 이미지 설명을 입력하십시오

메모

전달 된 변수 이름을 사용하여 호출에 레이블을 지정할지 또는 하나의 특정 사례 만 문서화하려는 경우 해당 값에 값을 지정할지 선택할 수 있습니다. 함수 자체를 호출하여 재귀를 표시 할 수도 있습니다.

또한 여기에 사용자를 표시하고 프롬프트를 표시하고 시스템에 입력을 쉽게 표시 할 수 있습니다. 상당히 유용한 시스템이라고 생각합니다.


감사합니다. 시퀀스 다이어그램을 알고 있지만 oop에 더 적합하다고 생각합니다. 필자의 경우 상황이 좀 더 지저분합니다. 예를 들어 약 20 개의 함수 / 도우미가 여러 모듈에 퍼져 있습니다. Ho 함수가 속한 모듈을 지정 하시겠습니까? 가져 오는 동안 일부 기능의 이름도 바뀌는 것을 고려하면 ..
— Leonardo

1
나는 당신이 얼마나 많은 모듈을 가지고 있는지 중요하지 않다고 말하고 싶습니다. 나중에 이름, ModuleA / function1, ModuleB / Function2 등을 찾을 수 있도록 이름을 지정하십시오. 20 개의 함수는 더 커지지 만 이해할 수는 없습니다. 당신이 할 수있는 또 다른 생각은 마지막 사용 후 함수의 줄을 끝내고 다른 함수 줄을 그 아래에 놓아 다이어그램의 수평 공간을 절약하는 것입니다.
— Ampt

7

콜 그래프가 가장 적합한 시각화라고 생각합니다. 직접 작성하지 않기로 결정 pyan하면 파이썬 파일에서 정적 분석을 수행하고 graphviz 도트 파일 (이미지로 렌더링 할 수 있음)을 통해 시각화 된 호출 그래프를 생성 할 수 있는 멋진 도구 가 있습니다. 몇 가지 포크가 있었지만 가장 완전한 기능을 갖춘 것은 https://github.com/davidfraser/pyan 인 것 같습니다 .

명령을 실행할 때 처리하려는 모든 파일을 지정하기 만하면됩니다.

python ~/bin/pyan.py --dot a.py b.py c.py -n > pyan.dot; dot -Tpng -opyan.png pyan.dot

또는

python ~/bin/pyan.py --dot $(find . -name '*.py') -n > pyan.dot; dot -Tpng -opyan.png pyan.dot

함수가 정의 된 위치를 나타내는 선을 제거하는 '-n'을 사용하여 그래프를 더 깨끗하게 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.