Vulture는 Python 프로그램에서 사용되지 않는 코드를 찾습니다. 이는 대규모 코드 베이스에서 오류를 정리하고 찾는 데 유용합니다. 라이브러리와 테스트 스위트 모두에서 Vulture를 실행하면 테스트되지 않은 코드를 찾을 수 있습니다.
Python의 동적 특성으로 인해 Vulture와 같은 정적 코드 분석기는 일부 데드 코드를 놓칠 가능성이 높습니다. 또한 암시적으로만 호출되는 코드는 사용되지 않은 것으로 보고될 수 있습니다. 그럼에도 불구하고 Vulture는 더 높은 코드 품질을 위한 매우 유용한 도구가 될 수 있습니다.
--sort-by-size
사용하여 사용되지 않는 클래스와 함수를 크기별로 정렬합니다. $ pip install vulture
$ vulture myscript.py # or
$ python3 -m vulture myscript.py
$ vulture myscript.py mypackage/
$ vulture myscript.py --min-confidence 100 # Only report 100% dead code.
제공된 인수는 Python 파일 또는 디렉터리일 수 있습니다. 각 디렉토리에 대해 Vulture는 포함된 모든 *.py 파일을 분석합니다.
데드 코드를 찾아 삭제한 후 Vulture를 다시 실행하세요. 더 많은 데드 코드를 발견할 수 있기 때문입니다.
사용되지 않는 함수, 클래스 등을 찾는 것 외에도 Vulture는 연결할 수 없는 코드를 감지할 수 있습니다. 데드 코드의 각 청크에는 60%에서 100% 사이의 신뢰도 값이 할당됩니다. 여기서 100% 값은 코드가 실행되지 않을 것이 확실하다는 신호입니다. 100% 미만의 값은 코드가 사용되지 않을 가능성에 대한 매우 대략적인 추정치(코드 청크 유형 기준)입니다.
코드 유형 | 신뢰도 |
---|---|
함수/메서드/클래스 인수, 연결할 수 없는 코드 | 100% |
수입 | 90% |
속성, 클래스, 함수, 메소드, 속성, 변수 | 60% |
--min-confidence
플래그를 사용하여 사용되지 않은 것으로 보고될 코드에 대한 최소 신뢰도를 설정할 수 있습니다. 분석된 파일 내에서 사용되지 않는 것이 보장된 코드만 보고하려면 --min-confidence 100
사용하십시오.
Vulture가 코드 덩어리를 사용되지 않은 것으로 잘못 보고하는 경우 오탐을 억제할 수 있는 몇 가지 옵션이 있습니다. 오탐지를 수정하면 다른 사용자에게도 도움이 될 수 있다면 문제 보고서를 제출해 주세요.
권장되는 옵션은 사용되지 않은 것으로 보고된 사용된 코드를 Python 모듈에 추가하고 이를 스캔된 경로 목록에 추가하는 것입니다. 이러한 화이트리스트를 자동으로 얻으려면 --make-whitelist
Vulture에 전달하십시오.
$ vulture mydir --make-whitelist > whitelist.py
$ vulture mydir whitelist.py
결과로 나오는 whitelist.py
파일에는 유효한 Python 구문이 포함되지만 Python이 이를 실행할 수 있으려면 일반적으로 몇 가지 수정이 필요합니다.
우리는 vulture/whitelists/
(풀 요청 환영)에서 일반적인 Python 모듈 및 패키지에 대한 화이트리스트를 수집합니다.
전체 파일이나 디렉터리를 무시하려면 --exclude
매개변수를 사용하세요(예: --exclude "*settings.py,*/docs/*.py,*/test_*.py,*/.venv/*.py"
). 제외 패턴은 절대 경로와 일치합니다.
flake8과의 호환성을 위해 Vulture는 사용하지 않는 가져오기( # noqa: F401
) 및 사용하지 않는 지역 변수( # noqa: F841
)를 무시하기 위한 F401 및 F841 오류 코드를 지원합니다. 그러나 noqa
댓글 대신 화이트리스트를 사용하는 것이 좋습니다. noqa
댓글은 코드에 시각적 노이즈를 추가하고 읽기 어렵게 만들기 때문입니다.
--ignore-names foo*,ba[rz]
사용하면 Vulture가 foo
로 시작하는 모든 이름과 bar
및 baz
이름을 무시하도록 할 수 있습니다. 추가적으로 --ignore-decorators
옵션을 사용하면 주어진 데코레이터로 장식된 함수의 이름을 무시할 수 있습니다(인수나 함수 본문은 제외). 이는 예를 들어 --ignore-decorators "@app.route"
사용하여 @app.route
데코레이터가 있는 모든 함수 이름을 무시할 수 있는 Flask 프로젝트에서 유용합니다. Vulture는 구문 분석할 수 없는 데코레이터를 단순화합니다. @foo.bar(x, y)
는 "@foo.bar"가 되고 @foo.bar(x, y).baz
내부적으로 "@"가 됩니다.
Vulture에 전달되면 화이트리스트가 자동으로 구문 정확성을 확인하고 종종 이를 Python 인터프리터에 전달하여 모든 화이트리스트에 포함되었는지 확인할 수도 있으므로 가능하면 --ignore-names
또는 --ignore-decorators
대신 화이트리스트를 사용하는 것이 좋습니다. 코드는 실제로 프로젝트에 여전히 존재합니다.
예를 들어 함수 서명에서 사용되지 않는 변수를 제거할 수 없는 상황이 있습니다. 권장되는 해결 방법은 PyLint 매뉴얼과 StackOverflow에 설명된 대로 del
키워드를 사용하는 것입니다.
def foo ( x , y ):
del y
return x + 3
Vulture는 또한 밑줄로 시작하는 모든 변수를 무시하므로 _x, y = get_pos()
사용하여 사용되지 않는 튜플 할당 또는 함수 인수를 표시할 수 있습니다(예: def foo(x, _y)
.
--min-confidence
플래그를 사용하여 최소 신뢰도 값을 높입니다.
Vulture가 if False:
와 같은 코드에 대해 불평하는 경우 부울 플래그 debug = False
사용하고 대신 if debug:
를 작성할 수 있습니다. 이렇게 하면 코드를 더 읽기 쉽게 만들고 Vulture를 침묵시킵니다.
#216을 참조하세요. 예를 들어 def foo(arg: "Sequence"): ...
대신 다음을 사용하는 것이 좋습니다.
from __future__ import annotations
def foo ( arg : Sequence ):
...
tool.vulture
섹션 아래의 pyproject.toml
에 명령줄 인수를 저장할 수도 있습니다. 간단히 선행 대시를 제거하고 나머지 대시를 모두 밑줄로 바꾸십시오.
명령줄에 제공된 옵션은 pyproject.toml
의 옵션보다 우선합니다.
예시 구성:
[ tool . vulture ]
exclude = [ " *file*.py " , " dir/ " ]
ignore_decorators = [ " @app.route " , " @require_* " ]
ignore_names = [ " visit_* " , " do_* " ]
make_whitelist = true
min_confidence = 80
paths = [ " myscript.py " , " mydir " , " whitelist.py " ]
sort_by_size = true
verbose = true
Vulture는 현재 작업 디렉터리에서 pyproject.toml
자동으로 찾습니다.
다른 디렉터리에서 pyproject.toml
을 사용하려면 --config path/to/pyproject.toml
플래그를 사용할 수 있습니다.
각 커밋 전에 사전 커밋 후크를 사용하여 Vulture를 실행할 수 있습니다. 이를 위해 사전 커밋을 설치하고 저장소의 .pre-commit-config.yaml
파일에 다음을 추가합니다.
repos :
- repo : https://github.com/jendrikseipp/vulture
rev : ' v2.3 ' # or any later Vulture version
hooks :
- id : vulture
그런 다음 pre-commit install
실행합니다. 마지막으로 저장소에 pyproject.toml
파일을 생성하고 Vulture가 [tool.vulture] --> paths
에서 확인해야 하는 모든 파일을 지정합니다(위 참조).
Vulture를 위한 GitHub Action도 있으며 Vulture를 프로그래밍 방식으로 사용할 수 있습니다. 예를 들어:
import vulture
v = vulture . Vulture ()
v . scavenge ([ '.' ])
unused_code = v . get_unused_code () # returns a list of `Item` objects
Vulture는 ast
모듈을 사용하여 주어진 모든 파일에 대한 추상 구문 트리를 구축합니다. 모든 구문 트리를 탐색하는 동안 정의되고 사용된 개체의 이름을 기록합니다. 그런 다음 정의되었지만 사용되지 않은 개체를 보고합니다. 이 분석에서는 범위를 무시하고 개체 이름만 고려합니다.
또한 Vulture는 return
, break
, continue
및 raise
문 이후의 코드를 찾고 만족할 수 없는 if
및 while
조건을 검색하여 도달할 수 없는 코드를 감지합니다.
--sort-by-size
옵션을 사용하면 Vulture는 사용되지 않는 코드를 줄 수를 기준으로 정렬합니다. 이는 개발자가 데드 코드를 먼저 찾을 위치의 우선순위를 정하는 데 도움이 됩니다.
다음 Python 스크립트( dead_code.py
)를 고려하세요.
import os
class Greeter :
def greet ( self ):
print ( "Hi" )
def hello_world ():
message = "Hello, world!"
greeter = Greeter ()
func_name = "greet"
greet_func = getattr ( greeter , func_name )
greet_func ()
if __name__ == "__main__" :
hello_world ()
전화 :
$ vulture dead_code.py
결과는 다음과 같습니다.
dead_code.py:1: unused import 'os' (90% confidence)
dead_code.py:4: unused function 'greet' (60% confidence)
dead_code.py:8: unused variable 'message' (60% confidence)
Vulture는 os
와 message
사용되지 않은 것으로 올바르게 보고하지만 greet
이 실제로 사용되는 것을 감지하지 못합니다. 이와 같은 거짓 긍정을 처리하는 데 권장되는 방법은 화이트리스트 Python 파일을 만드는 것입니다.
화이트리스트 준비 중
화이트리스트에서는 변수, 속성 등의 사용을 시뮬레이션합니다. 위 프로그램의 경우 화이트리스트는 다음과 같습니다.
# whitelist_dead_code.py
from dead_code import Greeter
Greeter . greet
또는 --make-whitelist
Vulture에 전달하고 자동으로 생성된 화이트리스트를 얻을 수 있습니다.
원래 프로그램과 화이트리스트를 모두 Vulture에 전달
$ vulture dead_code.py whitelist_dead_code.py
Vulture가 greet
메서드를 무시하게 만듭니다.
dead_code.py:1: unused import 'os' (90% confidence)
dead_code.py:8: unused variable 'message' (60% confidence)
종료 코드 | 설명 |
---|---|
0 | 데드 코드가 발견되지 않았습니다 |
1 | 잘못된 입력(파일 누락, 구문 오류, 잘못된 인코딩) |
2 | 잘못된 명령줄 인수 |
3 | 데드 코드 발견 |
문제를 보고하거나 풀 요청을 하려면 https://github.com/jendrikseipp/vulture를 방문하세요.