나는 파이썬으로 작성된 오래된 코드베이스를 유지하고 있습니다. 특히 모듈에서 다른 함수를 호출하는 복잡한 코드가 있습니다. 다른 함수 등을 호출하는 다른 모듈에서. OOP가 아니라 함수와 모듈뿐입니다.
메인 함수를 호출 할 때마다 흐름이 시작되고 끝나는 위치를 추적하려고 노력했지만 그릴 필요가 있다고 느낍니다. 이것은 하위 호출에서 길을 잃고 있기 때문입니다.
각 함수가 자신의 작업을 완료하고 호출자에게 값을 반환하기 위해 자신의 본문 내에서 여러 외부 함수를 호출한다는 것입니다.
어떻게 그릴 수 있습니까? 어떤 종류의 차트 / 그래픽이 이런 종류의 동작 / 코드를 문서화하는 데 적절할까요?
그래서 UML 다이어그램을 그리는 데 유용하지 않다고 생각합니다. , 플로차트도 아닙니다. 콜 그래프일까요?
댓글
- doxygen-통화 / 발신자 그래프를 생성합니다. I ' 파이썬을 얼마나 지원하는지 잘 모르겠습니다. 파이썬 코드를 문서화 할 수 있다는 것을 알고 있습니다.
- 나는 ' pycallgraph를 시도했지만 '도 마찬가지입니다. 사용하기에는 복잡하거나 너무 깊습니다. 이것은 일반 파이썬과 django 및 API URL에 대한 외부 호출을 혼합하기 때문에 내 코드의 복잡성 때문입니다. 그래서 제가 필요한 부분 만 고려해서 손으로 그리고 싶었습니다. 문제는 ' 시스템을 완전히 이해하기 위해 어떤 종류의 그래프를 사용해야할지 모르겠다는 것입니다.
- 이것이 단지 이해를 돕기위한 것이라면 , 자연스럽게 오는 것을 그립니다. 나중에 공식 문서로 들어가면 ' 언제든지 정리할 수 있습니다.
답변
여기서 찾고있는 것은 시퀀스 다이어그램 입니다.이를 통해 다양한 모듈이 호출하는 순서를 시각화 할 수 있습니다. 화살표를 사용하여 서로.
하나를 구성하는 것은 간단합니다.
- 시작 클래스를 그 아래에 점선으로 그립니다.
- 다음 클래스를 그립니다. 그 아래에 점선이있는 통화 추적의 클래스 / 메소드
- 마지막으로 그린 화살표 아래에 수직으로 배치 된 화살표로 선을 연결
- 모든 통화에 대해 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")
가장 먼저 그릴 것은 long_division
메소드에 연결하는 진입 점 (main
)입니다. . 이것은 long_에 상자를 생성합니다. 나누기, 메서드 호출의 범위를 나타냅니다. 이 간단한 예의 경우, 이것이 실행되는 유일한 것이므로 상자는 시퀀스 다이어그램의 전체 높이가됩니다.
이제 find_largest_fit
를 호출하여 작업 번호에 맞는 가장 큰 배수를 찾습니다. , 우리에게 반환합니다. 함수 호출 범위를 나타내는 다른 상자를 사용하여 long_division
에서 find_largest_fit
까지 선을 그립니다. 승수가 반환 될 때 상자가 어떻게 끝나는 지 확인합니다. 이것으로 함수 범위의 끝입니다!
더 큰 숫자에 대해 몇 번 반복하면 차트가 다음과 같이 표시됩니다.
참고
전달 된 변수 이름으로 호출에 레이블을 지정할지 아니면 원하는 경우에만 값을 지정할지 선택할 수 있습니다. 하나의 특정 사례를 문서화하십시오. 자신을 호출하는 함수로 재귀를 표시 할 수도 있습니다.
또한 여기에 사용자를 표시하고 메시지를 표시하고 시스템에 입력 한 내용을 충분히 쉽게 표시 할 수 있습니다. 꽤나 유용한 시스템이라고 생각합니다.
댓글
- 감사합니다. 시퀀스 다이어그램을 알고 있습니다. 나에게 더 적합하다고 느낀다. 제 경우에는 상황이 좀 더 지저분합니다. 예를 들어 여러 모듈에 약 20 개의 함수 / 도우미가 분산되어 있다는 의미입니다. 함수가 속한 모듈을 지정해야합니까? 일부 함수는 임포트 중에 이름이 변경된다는 점을 감안할 때 ..
- 당신이 얼마나 많은 모듈을 가지고 있는지는 중요하지 않다고 말하고 싶습니다. 위의 예도 전혀 엉망이 아닙니다. 나중에 찾을 수 있도록 ModuleA / function1, ModuleB / Function2 등의 이름 만 지정하면됩니다. 20 개 함수의 경우 더 커질 수 있지만 확실히 이해하는 것이 불가능하지는 않습니다. 또 다른 방법은 마지막으로 사용한 함수의 줄을 끝내고 그 아래에 다른 함수 줄을 넣어 다이어그램의 가로 공간을 절약하는 것입니다.
답변
콜 그래프가 가장 적절한 시각화라고 생각합니다.손으로하지 않기로 결정한 경우 “python 파일에 대한 정적 분석을 수행하고 graphviz 점을 통해 시각화 된 호출 그래프를 생성 할 수있는 pyan
라는 멋진 도구가 있습니다. 파일 (이미지로 렌더링 할 수 있음). 두 개의 포크가 있었지만 가장 완전한 기능을 갖춘 포크는 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”을 사용하여 그래프를 더 깔끔하게 만들 수 있습니다. 함수가 정의 된 위치를 보여주는 줄