콜 그래프 그리기


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