อีแร้งค้นหาโค้ดที่ไม่ได้ใช้ในโปรแกรม 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 และเพิ่มลงในรายการเส้นทางที่สแกน หากต้องการรับ whitelist ดังกล่าวโดยอัตโนมัติ ให้ส่ง --make-whitelist
ไปที่ Vulture:
$ vulture mydir --make-whitelist > whitelist.py
$ vulture mydir whitelist.py
โปรดทราบว่าไฟล์ whitelist.py
ที่ได้จะมีไวยากรณ์ Python ที่ถูกต้อง แต่เพื่อให้ Python เรียก ใช้ได้ โดยปกติคุณจะต้องทำการแก้ไขบางอย่าง
เรารวบรวมไวท์ลิสต์สำหรับโมดูลและแพ็คเกจ Python ทั่วไปใน vulture/whitelists/
(ยินดีรับคำขอดึง)
หากคุณต้องการละเว้นทั้งไฟล์หรือไดเร็กทอรี ให้ใช้พารามิเตอร์ --exclude
(เช่น --exclude "*settings.py,*/docs/*.py,*/test_*.py,*/.venv/*.py"
) รูปแบบการยกเว้นจะจับคู่กับเส้นทางที่แน่นอน
เพื่อความเข้ากันได้กับ flake8 Vulture รองรับรหัสข้อผิดพลาด F401 และ F841 สำหรับการละเว้นการนำเข้าที่ไม่ได้ใช้ ( # noqa: F401
) และตัวแปรท้องถิ่นที่ไม่ได้ใช้ ( # noqa: F841
) อย่างไรก็ตาม เราขอแนะนำให้ใช้รายการที่อนุญาตแทนความคิดเห็น noqa
เนื่องจากความคิดเห็น noqa
จะเพิ่มสัญญาณรบกวนทางภาพให้กับโค้ดและทำให้อ่านยากขึ้น
คุณสามารถใช้ --ignore-names foo*,ba[rz]
เพื่อให้ Vulture ละเว้นชื่อทั้งหมดที่ขึ้นต้นด้วย foo
และ bar
ชื่อและ baz
นอกจากนี้ ตัวเลือก --ignore-decorators
ยังสามารถใช้เพื่อละเว้นชื่อของฟังก์ชันที่ตกแต่งด้วยมัณฑนากรที่กำหนด (แต่ไม่ใช่อาร์กิวเมนต์หรือเนื้อหาของฟังก์ชัน) สิ่งนี้มีประโยชน์เช่นในโปรเจ็กต์ Flask ซึ่งคุณสามารถใช้ --ignore-decorators "@app.route"
เพื่อละเว้นชื่อฟังก์ชันทั้งหมดด้วย @app.route
decorator โปรดทราบว่า Vulture ทำให้การตกแต่งง่ายขึ้น แต่ไม่สามารถแยกวิเคราะห์ได้: @foo.bar(x, y)
กลายเป็น "@foo.bar" และ @foo.bar(x, y).baz
กลายเป็น "@" ภายใน
เราขอแนะนำให้ใช้ whitelists แทน --ignore-names
หรือ --ignore-decorators
ทุกครั้งที่เป็นไปได้ เนื่องจาก whitelists จะถูกตรวจสอบความถูกต้องทางวากยสัมพันธ์โดยอัตโนมัติเมื่อส่งไปยัง Vulture และบ่อยครั้งที่คุณสามารถส่งต่อไปยังล่าม Python ของคุณและปล่อยให้มันตรวจสอบว่า whitelist ทั้งหมด รหัสยังคงมีอยู่ในโครงการของคุณ
มีสถานการณ์ที่คุณไม่สามารถลบตัวแปรที่ไม่ได้ใช้ออกไปได้ เช่น ในลายเซ็นของฟังก์ชัน วิธีแก้ปัญหาที่แนะนำคือใช้คีย์เวิร์ด del
ตามที่อธิบายไว้ในคู่มือ PyLint และใน StackOverflow:
def foo ( x , y ):
del y
return x + 3
นอกจากนี้ Vulture จะละเว้นตัวแปรทั้งหมดที่ขึ้นต้นด้วยขีดล่าง ดังนั้นคุณสามารถใช้ _x, y = get_pos()
เพื่อทำเครื่องหมายการกำหนดค่าทูเพิลที่ไม่ได้ใช้หรืออาร์กิวเมนต์ของฟังก์ชัน เช่น def foo(x, _y)
เพิ่มค่าความเชื่อมั่นขั้นต่ำด้วยแฟล็ก --min-confidence
หาก Vulture บ่นเกี่ยวกับโค้ดเช่น if False:
คุณสามารถใช้แฟล็ก Boolean debug = False
และเขียน if debug:
แทน สิ่งนี้ทำให้โค้ดอ่านง่ายขึ้นและทำให้ Vulture ปิดเสียง
ดู #216. ตัวอย่างเช่น แทนที่จะใช้ def foo(arg: "Sequence"): ...
เราแนะนำให้ใช้
from __future__ import annotations
def foo ( arg : Sequence ):
...
คุณยังสามารถจัดเก็บอาร์กิวเมนต์บรรทัดคำสั่งใน pyproject.toml
ใต้ส่วน tool.vulture
เพียงลบขีดกลางนำออกและแทนที่ขีดกลางที่เหลือทั้งหมดด้วยขีดล่าง
ตัวเลือกที่ให้ไว้ในบรรทัดคำสั่งมีความสำคัญมากกว่าตัวเลือกใน 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 และเพิ่มสิ่งต่อไปนี้ลงในไฟล์ .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
(ดูด้านบน)
นอกจากนี้ยังมี GitHub Action for Vulture และคุณสามารถใช้ Vulture โดยทางโปรแกรมได้ ตัวอย่างเช่น:
import vulture
v = vulture . Vulture ()
v . scavenge ([ '.' ])
unused_code = v . get_unused_code () # returns a list of `Item` objects
อีแร้งใช้โมดูล 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 เราจำลองการใช้ตัวแปร คุณลักษณะ และอื่นๆ สำหรับโปรแกรมด้านบน whitelist อาจมีลักษณะดังนี้:
# 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 เพื่อรายงานปัญหาใด ๆ หรือส่งคำขอดึงข้อมูล