เครื่องมือในการแปลงรหัส Python ให้เป็นไปตามข้อกำหนด PEP8


113

ฉันรู้ว่ามีเครื่องมือที่ช่วยในการตรวจสอบว่าเป็นรหัสหลามของคุณเป็นไปตาม PEP8 เช่นมีทั้งเป็นบริการออนไลน์และโมดูลหลาม

อย่างไรก็ตามฉันไม่พบบริการหรือโมดูลที่สามารถแปลงไฟล์ Python ของฉันเป็นไฟล์ Python ที่ถูกต้องในตัวของ PEP8 มีใครรู้บ้างว่ามีไหม?
ฉันคิดว่ามันเป็นไปได้เนื่องจาก PEP8 เป็นข้อมูลเกี่ยวกับลักษณะที่ปรากฏของโค้ดใช่ไหม?


1
ฉันไม่คิดว่าจะมีเครื่องมือใดที่แปลงรหัสเป็นรหัสที่เข้ากันได้กับ PEP8 PEP8 รวมกฎการตั้งชื่อตัวแปรเช่นกันดังนั้นหากมีเครื่องมือดังกล่าวอยู่ก็จะเปลี่ยนชื่อตัวแปรของคุณด้วยและคุณอาจไม่สามารถเข้าใจรหัสของคุณเองได้
Ashwini Chaudhary

1
@AshwiniChaudhary นั่นเป็นจุดที่ดีมันควรค่าแก่การกล่าวถึงว่าการเปลี่ยนชื่อตัวแปรอาจส่งผลกระทบต่อผู้อื่นที่ใช้รหัสของคุณอยู่แล้วดังนั้นจึงไม่ใช่ความคิดที่ดีเสมอไป (autopep8 ไม่ทำเช่นนี้)
Andy Hayden

คำตอบ:


38

น่าเสียดายที่ "pep8 storming" (ทั้งโครงการ) มีผลข้างเคียงเชิงลบหลายประการ:

  • ความขัดแย้งในการรวมจำนวนมาก
  • ทำลายคอมไพล์
  • ตรวจสอบโค้ดได้ยาก

เป็นอีกทางเลือกหนึ่ง (และขอบคุณ@yp สำหรับแนวคิดนี้ ) ฉันเขียนแพ็คเกจขนาดเล็กซึ่ง autopep8s เฉพาะบรรทัดที่คุณได้ดำเนินการตั้งแต่การกระทำ / สาขาสุดท้าย:

โดยพื้นฐานแล้วการออกจากโครงการจะ ดีกว่าที่คุณพบเล็กน้อย :

pip install pep8radius

สมมติว่าคุณทำงานเสร็จmasterและพร้อมที่จะกระทำ:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

หรือเพื่อล้างบรรทัดใหม่ที่คุณได้กระทำไว้ตั้งแต่การคอมมิตครั้งล่าสุด:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

โดยทั่วไปpep8radiusจะใช้ autopep8 กับบรรทัดในเอาต์พุตของ git / hg diff (จากคอมมิตที่แชร์ล่าสุด )

ขณะนี้สคริปต์นี้ใช้งานได้กับ git และ hg หากคุณใช้อย่างอื่นและต้องการให้ใช้งานได้โปรดโพสต์ความคิดเห็น / ปัญหา / PR !


2
+1 ความคิดริเริ่มที่ดีมาก ... ฉันกำลังคิดเกี่ยวกับวิธีสร้างปลั๊กอิน Notepad ++ เพื่อจุดประสงค์เดียวกัน ... เนื่องจากเป็นโปรแกรมแก้ไขที่ฉันชอบใน Windows
kmonsoor

1
@kmonsoor ความคิดที่ดีฉันไม่ได้คิดเกี่ยวกับปลั๊กอินตัวแก้ไข! แจ้งให้เราทราบใน github วิธีใดก็ได้ที่ฉันสามารถช่วย / ใช้งานนอก CLI ได้ง่ายขึ้น ... ฉันมองเห็นปัญหาบางอย่าง (แก้ไขได้)
Andy Hayden

ที่นี่ฉันพบรายการปลั๊กอินตัวแก้ไขที่น่าสนใจgithub.com/jcrocholl/pep8/wiki/RelatedToolsแม้ว่าจะไม่มีโชคสำหรับ Notepad ++ ...
kmonsoor

1
ฉันเพิ่งสร้างสคริปต์เพื่อเชื่อมระหว่าง Notepad ++ และ Autopep8 โดยใช้ปลั๊กอินอื่น "Python Script" อย่างไรก็ตามมันได้ผล โปรดตรวจสอบที่นี่: bit.ly/pep8_tonizer
kmonsoor

185

คุณสามารถใช้autopep8 ! ในขณะที่คุณชงกาแฟด้วยตัวเองเครื่องมือนี้จะช่วยขจัดการละเมิด PEP8 ที่น่ารำคาญทั้งหมดซึ่งไม่ได้เปลี่ยนความหมายของรหัส

ติดตั้งผ่าน pip:

pip install autopep8

ใช้สิ่งนี้กับไฟล์เฉพาะ:

autopep8 py_file --in-place

หรือไปยังโครงการของคุณ (เรียกซ้ำ) ตัวเลือก verbose จะให้ข้อเสนอแนะบางประการเกี่ยวกับวิธีการดำเนินการ :

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

หมายเหตุ: บางครั้งค่าเริ่มต้น 100 รอบไม่เพียงพอฉันตั้งค่าเป็น 2000 เนื่องจากมันสูงพอสมควรและจะจับไฟล์ทั้งหมดยกเว้นไฟล์ที่ลำบากที่สุด (มันจะหยุดส่งเมื่อไม่พบการละเมิด pep8 ที่แก้ไขได้) ...

ณ จุดนี้ฉันขอแนะนำให้ทำการทดสอบซ้ำและทำการคอมมิต!

หากคุณต้องการปฏิบัติตามข้อกำหนด PEP8 แบบ "เต็ม"กลยุทธ์อย่างหนึ่งที่ฉันเคยใช้คือเรียกใช้ autopep8 ตามด้านบนจากนั้นเรียกใช้ PEP8 ซึ่งจะพิมพ์การละเมิดที่เหลือ (ไฟล์หมายเลขบรรทัดและสิ่งที่):

pep8 project_dir --ignore=E501

และเปลี่ยนสิ่งเหล่านี้ทีละรายการด้วยตนเอง (เช่น E712s - เปรียบเทียบกับบูลีน)

หมายเหตุ: autopep8 เสนอ--aggressiveข้อโต้แย้ง (เพื่อ "แก้ไข" การละเมิดที่เปลี่ยนแปลงความหมายเหล่านี้อย่างไร้ความปรานี) แต่ระวังถ้าคุณใช้ความก้าวร้าวคุณอาจต้องแก้ไขข้อบกพร่อง ... (เช่นใน numpy / pandas True == np.bool_(True)แต่ไม่ใช่True is np.bool_(True)!)

คุณสามารถตรวจสอบจำนวนการละเมิดแต่ละประเภท (ก่อนและหลัง):

pep8 --quiet --statistics .

หมายเหตุ: ฉันคิดว่า E501s (บรรทัดยาวเกินไป) เป็นกรณีพิเศษเนื่องจากอาจมีจำนวนมากในโค้ดของคุณและบางครั้งก็ไม่ได้รับการแก้ไขโดย autopep8

ตัวอย่างเช่นฉันใช้เทคนิคนี้กับฐานรหัสแพนด้า


@hayden คุณมีความคิดเห็นใด ๆ เกี่ยวกับความน่าเชื่อถือและอัตราส่วนของการแก้ไขอัตโนมัติกับปัญหาแปลก ๆ ที่แนะนำหรือไม่?
Marius

@ มาริอุสฉันใช้สิ่งนี้กับรหัสแพนด้า (ซึ่งค่อนข้างใหญ่) และมันไม่ได้แสดงปัญหาแปลก ๆ มันจะไม่เปลี่ยนรหัสที่เปลี่ยนความหมายฉันอัปเดตคำตอบเพื่อพูดถึงสิ่งเหล่านี้ ก่อนหน้านี้มีปัญหากับแฮชบังของ Sphinx (แก้ไขข้อบกพร่องใน PEP8 แล้ว)
Andy Hayden

2
สิ่งนี้บังคับใช้ Strunk และ White ในความคิดเห็นหรือไม่?
Eric

1
ตั้งแต่วันที่ 25 ตุลาคม 2017 pep8แพ็คเกจที่กล่าวถึงในคำตอบนี้ได้ถูกเปลี่ยนชื่อเป็นpycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007

8

@Andy Hayden ให้ภาพรวมที่ดีของ autopep8 นอกจากนั้นยังมีอีกหนึ่งแพ็คเกจที่เรียกว่าpep8ifyซึ่งทำสิ่งเดียวกัน

อย่างไรก็ตามแพ็คเกจทั้งสองสามารถลบได้เฉพาะข้อผิดพลาดที่เป็นขุย แต่ไม่สามารถจัดรูปแบบโค้ดได้

little = more[3:   5]

โค้ดด้านบนจะยังคงเหมือนเดิมหลังจาก pep8ifying ด้วย แต่รหัสยังดูไม่ดี คุณสามารถใช้ฟอร์แมตเช่นyapfซึ่งจะจัดรูปแบบโค้ดแม้ว่าโค้ดจะเป็นไปตามข้อกำหนด PEP8 ก็ตาม โค้ดด้านบนจะถูกจัดรูปแบบเป็น

little = more[3:5]

บางครั้งอาจทำลายการจัดรูปแบบด้วยตนเองของคุณ ตัวอย่างเช่น

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

จะถูกแปลงเป็นไฟล์

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

แต่คุณสามารถบอกให้ละเว้นบางส่วนได้

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

นำมาจากบล็อกโพสต์เก่าของฉัน: PEP8 และจัดรูปแบบรหัส Python ของคุณโดยอัตโนมัติ!


2
เป็นlittle = more[3: 5]ข้อผิดพลาดใน pep8 (ห้องสมุด)? yapf เป็นอนาคตที่แน่นอนที่นี่อัลกอริทึมที่อยู่เบื้องหลัง (โดยพื้นฐานแล้วเป็นเส้นทางที่สั้นที่สุดในกราฟของตัวเลือกการจัดรูปแบบทั้งหมด) เป็นโซลูชันที่ยอดเยี่ยมมากและมีแนวโน้มที่จะมีข้อบกพร่องน้อยลงรวมถึงการจัดรูปแบบตามรูปแบบบัญญัติ
Andy Hayden

@AndyHayden ดูเหมือนว่าจะเป็นฟีเจอร์ที่ขาดหายไป แต่ไม่สามารถแก้ไข E225 ได้
ChillarAnand

5

หากคุณใช้ eclipse + PyDev คุณสามารถเปิดใช้งาน autopep8 จากการตั้งค่าของ PyDev: Windows -> Preferences -> พิมพ์ 'autopep8' ในตัวกรองการค้นหา

ตรวจสอบ 'use autopep8.py for code formatting?' -> ตกลง

ตอนนี้การจัดรูปแบบโค้ด CTRL-SHIFT-F ของคราสควรจัดรูปแบบโค้ดของคุณโดยใช้ autopep8 :)

ภาพหน้าจอ


3

ฉันทำการวิจัยอย่างกว้างขวางเกี่ยวกับเครื่องมือต่างๆสำหรับ python และ code style มีเครื่องมือสองประเภท: linters - การวิเคราะห์โค้ดของคุณและให้คำเตือนเกี่ยวกับรูปแบบโค้ดที่ใช้ไม่ดีและแสดงคำแนะนำวิธีแก้ไขและการจัดรูปแบบโค้ด - เมื่อคุณบันทึกไฟล์ไฟล์จะจัดรูปแบบเอกสารของคุณใหม่โดยใช้สไตล์ PEP

เนื่องจากการจัดรูปแบบใหม่จะต้องมีความแม่นยำมากขึ้น - หากการจัดรูปแบบใหม่ที่คุณไม่ต้องการให้กลายเป็นสิ่งที่ไร้ประโยชน์ - สิ่งเหล่านี้ครอบคลุมส่วนของ PEP น้อยกว่าเศษผ้าจะแสดงมากขึ้น

พวกเขาทั้งหมดมีสิทธิ์ที่แตกต่างกันสำหรับการกำหนดค่าตัวอย่างเช่น pylinter สามารถกำหนดค่าได้ในกฎทั้งหมด (คุณสามารถเปิด / ปิดคำเตือนทุกประเภท) สีดำไม่สามารถกำหนดค่าได้เลย

นี่คือลิงค์และบทช่วยสอนที่มีประโยชน์:

เอกสารประกอบ:

ผ้าสำลี (ตามลำดับความนิยม):

  • mypy https://github.com/python/mypy linter สำหรับการตรวจสอบประเภท (PEP-484)
  • pycodestyle https://github.com/PyCQA/pycodestyle - ดีที่ใช้ PEP-8 เป็นที่นิยมมาก มักใช้ควบคู่ไปกับไพลินท์และเกล็ด 8 (พร้อมกัน)
  • pylint https://github.com/PyCQA/pylintกำหนดค่าได้มากรองรับอย่างแข็งขัน
  • โจรhttps://github.com/PyCQA/bandit линтерпобезопасности
  • ผู้มุ่งหวังhttps://github.com/PyCQA/prospector pylint + การตรวจสอบรหัสความยาก
  • flake8 https://github.com/PyCQA/flake8เสื้อคลุม pycodestyle พร้อมความสามารถในการเปิดปลั๊กอิน รายการปลั๊กอินที่กำหนดค่าต่างๆได้จำนวนมาก นี่คือ repo flake8 ที่ยอดเยี่ยม: https://github.com/DmytroLitvinov/awesome-flake8-extensions
  • wemake https://github.com/wemake-services/wemake-python-styleguide - พยายามรวมเศษผ้าที่แตกต่างกันจำนวนมากในโครงการเดียว (จริงๆแล้วมันเป็นปลั๊กอิน flake8 ที่รวมสไตล์จากผ้าสำลีอื่น ๆ )
  • pylama https://github.com/klen/pylamaพยายามรวม 10 เศษอีกอันเข้าด้วยกัน (mypy, pylint, pycodeestyle, pydocstyle идр.) ฉันเห็นปัญหาเดียวที่นี่ - เวอร์ชันเก่า (ไม่มีการอัปเดตใน github repo เป็นเวลาประมาณ 10 เดือน)
  • pydocstyle https://github.com/PyCQA/pydocstyle docstrings linter (PEP-257)

รูปแบบรหัส (ตามความนิยม):

  • black https://github.com/psf/blackฟอร์แมตเตอร์ที่เป็นที่นิยมมากที่สุดซึ่งใช้ใน บริษัท ใหญ่ ๆ หลายแห่ง ถูกสร้างขึ้นช้ากว่า yapf แต่มีจุดเริ่มต้นที่ GitHub มากขึ้นแล้ว
  • yapf https://github.com/google/yapf ตัวจัดรูปแบบโค้ดของ Google
  • autopep8 https://github.com/hhatto/autopep8สร้างจาก pycodestyle

1

มีมากมาย.

โดยปกติ IDE จะมีความสามารถในการจัดรูปแบบในตัว IntelliJ Idea / PyCharm ทำเช่นเดียวกันกับปลั๊กอิน Python สำหรับ Eclipse และอื่น ๆ

มีรูปแบบ / linters ที่กำหนดเป้าหมายได้หลายภาษา https://coala.ioเป็นตัวอย่างที่ดีของผู้

จากนั้นมีเครื่องมือจุดประสงค์เดียวซึ่งมีการกล่าวถึงหลายคำตอบในคำตอบอื่น ๆ

วิธีการเฉพาะอย่างหนึ่งในการจัดรูปแบบอัตโนมัติคือการแยกวิเคราะห์ไฟล์ลงในโครงสร้าง AST (โดยไม่ต้องทิ้งความคิดเห็น) จากนั้นถ่ายโอนข้อมูลกลับเป็นข้อความ (หมายความว่าไม่มีการจัดรูปแบบเดิมไว้) ตัวอย่างของการที่จะhttps://github.com/python/black

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.