autopep8 จัดรูปแบบโค้ด Python โดยอัตโนมัติเพื่อให้สอดคล้องกับคำแนะนำสไตล์ PEP 8 ใช้ยูทิลิตี้ pycodestyle เพื่อกำหนดว่าส่วนใดของโค้ดที่ต้องจัดรูปแบบ autopep8 สามารถแก้ไขปัญหาการจัดรูปแบบส่วนใหญ่ที่ pycodestyle รายงานได้
สารบัญ
pkg_resources.DistributionNotFound
จากปิ๊ป:
$ pip ติดตั้ง -- อัปเกรด autopep8
พิจารณาใช้ตัวเลือก --user
autopep8 ต้องใช้ pycodestyle
หากต้องการแก้ไขไฟล์ที่มีอยู่ (ด้วยระดับก้าวร้าว 2):
$ autopep8 --in-place --aggressive --aggressive <ชื่อไฟล์>
ก่อนที่จะรัน autopep8
import math , sys ;
def example1 ():
####This is a long comment. This should be wrapped to fit within 72 characters.
some_tuple = ( 1 , 2 , 3 , 'a' );
some_variable = { 'long' : 'Long code lines should be wrapped within 79 characters.' ,
'other' :[ math . pi , 100 , 200 , 300 , 9876543210 , 'This is a long string that goes on' ],
'more' :{ 'inner' : 'This whole logical line should be wrapped.' , some_tuple :[ 1 ,
20 , 300 , 40000 , 500000000 , 60000000000000000 ]}}
return ( some_tuple , some_variable )
def example2 (): return { 'has_key() is deprecated' : True }. has_key ({ 'f' : 2 }. has_key ( '' ));
class Example3 ( object ):
def __init__ ( self , bar ):
#Comments should have a space after the hash.
if bar : bar += 1 ; bar = bar * bar ; return bar
else :
some_string = """
Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
return ( sys . path , some_string )
หลังจากรัน autopep8 แล้ว
import math
import sys
def example1 ():
# This is a long comment. This should be wrapped to fit within 72
# characters.
some_tuple = ( 1 , 2 , 3 , 'a' )
some_variable = {
'long' : 'Long code lines should be wrapped within 79 characters.' ,
'other' : [
math . pi ,
100 ,
200 ,
300 ,
9876543210 ,
'This is a long string that goes on' ],
'more' : {
'inner' : 'This whole logical line should be wrapped.' ,
some_tuple : [
1 ,
20 ,
300 ,
40000 ,
500000000 ,
60000000000000000 ]}}
return ( some_tuple , some_variable )
def example2 (): return ( '' in { 'f' : 2 }) in { 'has_key() is deprecated' : True }
class Example3 ( object ):
def __init__ ( self , bar ):
# Comments should have a space after the hash.
if bar :
bar += 1
bar = bar * bar
return bar
else :
some_string = """
Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
return ( sys . path , some_string )
ตัวเลือก:
การใช้งาน: autopep8 [-h] [--version] [-v] [-d] [-i] [--ชื่อไฟล์ global-config] [--ละเว้น-local-config] [-r] [-jn] [-pn] [-a] [--ทดลอง] [--ไม่รวม globs] [--รายการแก้ไข] [--ละเว้นข้อผิดพลาด] [-เลือกข้อผิดพลาด] [--ความยาวบรรทัดสูงสุด n] [--บรรทัดช่วงบรรทัด] [--แขวนปิด] [--รหัสทางออก] [ไฟล์ [ไฟล์ ...]] จัดรูปแบบโค้ด Python โดยอัตโนมัติเพื่อให้สอดคล้องกับคำแนะนำสไตล์ PEP 8 ข้อโต้แย้งเกี่ยวกับตำแหน่ง: ไฟล์เพื่อจัดรูปแบบหรือ '-' สำหรับมาตรฐานใน อาร์กิวเมนต์ทางเลือก: -h, --help แสดงข้อความช่วยเหลือนี้และออก --version แสดงหมายเลขเวอร์ชันของโปรแกรมและออก -v, --verbose พิมพ์ข้อความอย่างละเอียด; multiple -v ส่งผลให้มีมากขึ้น ข้อความโดยละเอียด -d, --diff พิมพ์ส่วนต่างสำหรับแหล่งคงที่ -i, --in-place ทำการเปลี่ยนแปลงไฟล์ในตำแหน่ง --ชื่อไฟล์ config ทั่วโลก พาธไปยังไฟล์กำหนดค่า pep8 ส่วนกลาง ถ้าไฟล์นี้เกิดขึ้น ไม่มีอยู่ สิ่งนี้จะถูกละเว้น (ค่าเริ่มต้น: ~/.config/pep8) --ignore-local-config.php อย่าค้นหาและใช้ไฟล์กำหนดค่าในเครื่อง ถ้าไม่ ผ่าน ค่าเริ่มต้นจะได้รับการอัปเดตด้วยไฟล์กำหนดค่าใดๆ ไดเรกทอรีรากของโครงการ -r, --recursive ทำงานซ้ำบนไดเร็กทอรี; จะต้องใช้ร่วมกับ --in-place หรือ --diff -jn, --jobs n จำนวนงานแบบขนาน; จับคู่จำนวน CPU หากค่าเป็น น้อยกว่า 1 -pn, --pep8-ผ่าน n จำนวนสูงสุดของการส่งผ่าน pep8 เพิ่มเติม (ค่าเริ่มต้น: อนันต์) -a, --aggressive เปิดใช้งานการเปลี่ยนแปลงที่ไม่ใช่ช่องว่าง; หลายรายการ -a ผลลัพธ์เข้า การเปลี่ยนแปลงเชิงรุกมากขึ้น --experimental เปิดใช้งานการแก้ไขแบบทดลอง --exclude globs ไม่รวมชื่อไฟล์/ไดเร็กทอรีที่ตรงกับเครื่องหมายจุลภาคเหล่านี้- ลูกโลกที่แยกจากกัน --list-fixes รหัสรายการสำหรับการแก้ไข; ใช้โดย --ignore และ --select --ignore ข้อผิดพลาดไม่สามารถแก้ไขข้อผิดพลาด/คำเตือนเหล่านี้ (ค่าเริ่มต้น: E226,E24,W50,W690) --select ข้อผิดพลาด แก้ไขเฉพาะข้อผิดพลาด/คำเตือนเหล่านี้ (เช่น E4,W) --max-line-length n ตั้งค่าความยาวบรรทัดสูงสุดที่อนุญาต (ค่าเริ่มต้น: 79) --เส้น-เส้นช่วง เส้น --เส้นช่วง เส้น แก้ไขข้อผิดพลาดที่พบภายในช่วงรวมนี้เท่านั้น หมายเลขบรรทัด (เช่น 1 99) หมายเลขบรรทัดมีการจัดทำดัชนีที่ 1 --hang-closing ตัวเลือก hang-closing ส่งผ่านไปยัง pycodestyle --exit-code เปลี่ยนเป็นพฤติกรรมของรหัสทางออก พฤติกรรมเริ่มต้นของ ค่าที่ส่งคืน 0 คือไม่มีความแตกต่าง 1 คือข้อผิดพลาดในการออก ส่งคืน 2 เมื่อเพิ่มตัวเลือกนี้ 2 มีอยู่ ความแตกต่าง
autopep8 แก้ไขปัญหาต่อไปนี้ที่รายงานโดย pycodestyle:
E101 - เยื้องทุกบรรทัด E11 - แก้ไขการเยื้อง E121 - แก้ไขการเยื้องให้เป็นพหุคูณของสี่ E122 - เพิ่มการเยื้องที่ขาดสำหรับการเยื้องแบบแขวน E123 - จัดวงเล็บปิดให้ตรงกับวงเล็บเปิด E124 - จัดวงเล็บปิดให้ตรงกับการเยื้องที่มองเห็น E125 - เยื้องเพื่อแยกบรรทัดจากบรรทัดตรรกะถัดไป E126 - แก้ไขการเยื้องแขวนที่เยื้องเกิน E127 - แก้ไขการเยื้องภาพ E128 - แก้ไขการเยื้องภาพ E129 - แก้ไขการเยื้องภาพ E131 - แก้ไขการเยื้องที่ค้างสำหรับบรรทัดต่อเนื่องที่ไม่ได้จัดแนว E133 - แก้ไขการเยื้องที่ขาดหายไปสำหรับวงเล็บปิด E20 - ลบช่องว่างที่ไม่เกี่ยวข้อง E211 - ลบช่องว่างที่ไม่เกี่ยวข้อง E22 - แก้ไขช่องว่างที่ไม่เกี่ยวข้องรอบคำหลัก E224 - ลบช่องว่างที่ไม่เกี่ยวข้องรอบๆ ตัวดำเนินการ E225 - แก้ไขช่องว่างรอบๆ ตัวดำเนินการ E226 - แก้ไขช่องว่างที่หายไปรอบๆ ตัวดำเนินการทางคณิตศาสตร์ E227 - แก้ไขช่องว่างที่หายไปรอบๆ ตัวดำเนินการระดับบิต/ตัวดำเนินการ E228 - แก้ไขช่องว่างที่หายไปรอบๆ ตัวดำเนินการแบบโมดูโล E231 - เพิ่มช่องว่างที่หายไป E241 - แก้ไขช่องว่างที่ไม่เกี่ยวข้องรอบคำหลัก E242 - ลบช่องว่างที่ไม่เกี่ยวข้องรอบๆ ตัวดำเนินการ E251 - ลบช่องว่างรอบเครื่องหมาย '=' ของพารามิเตอร์ E252 - ไม่มีช่องว่างรอบพารามิเตอร์เท่ากับ E26 - แก้ไขการเว้นวรรคหลังแฮชความคิดเห็นสำหรับความคิดเห็นแบบอินไลน์ E265 - แก้ไขการเว้นวรรคหลังแฮชความคิดเห็นสำหรับบล็อกความคิดเห็น E266 - แก้ไข '#' นำหน้ามากเกินไปสำหรับความคิดเห็นแบบบล็อก E27 - แก้ไขช่องว่างที่ไม่เกี่ยวข้องรอบคำหลัก E301 - เพิ่มบรรทัดว่างที่ขาดหายไป E302 - เพิ่มบรรทัดว่าง 2 บรรทัดที่ขาดหายไป E303 - ลบบรรทัดว่างเพิ่มเติม E304 - ลบบรรทัดว่างตามตัวตกแต่งฟังก์ชัน E305 - คาดว่าจะมี 2 บรรทัดว่างหลังจากสิ้นสุดฟังก์ชันหรือคลาส E306 - ควรมี 1 บรรทัดว่างก่อนคำจำกัดความที่ซ้อนกัน E401 - ใส่การนำเข้าแยกบรรทัด E402 - แก้ไขการนำเข้าระดับโมดูลไม่อยู่ด้านบนของไฟล์ E501 - พยายามทำให้บรรทัดพอดีกับอักขระ --max-line-length E502 - ลบการขึ้นบรรทัดใหม่ที่ไม่เกี่ยวข้อง E701 - ใส่คำสั่งผสมที่คั่นด้วยเครื่องหมายโคลอนในบรรทัดแยกกัน E70 - ใส่คำสั่งผสมที่คั่นด้วยเครื่องหมายอัฒภาคในบรรทัดแยกกัน E711 - แก้ไขการเปรียบเทียบกับไม่มี E712 - แก้ไขการเปรียบเทียบกับบูลีน E713 - ใช้ 'not in' เพื่อทดสอบการเป็นสมาชิก E714 - ใช้การทดสอบ 'ไม่ใช่' เพื่อระบุตัวตนของวัตถุ E721 - ใช้ "isinstance()" แทนการเปรียบเทียบประเภทโดยตรง E722 - แก้ไขเปลือยยกเว้น E731 - ใช้ def เมื่อใช้งานอย่ากำหนดนิพจน์แลมบ์ดา W291 - ลบช่องว่างต่อท้าย W292 - เพิ่มบรรทัดใหม่ต่อท้ายไฟล์ W293 - ลบช่องว่างต่อท้ายบนบรรทัดว่าง W391 - ลบบรรทัดว่างต่อท้าย W503 - แก้ไขตัวแบ่งบรรทัดก่อนตัวดำเนินการไบนารี W504 - แก้ไขตัวแบ่งบรรทัดหลังตัวดำเนินการไบนารี W605 - แก้ไขลำดับการหลีกเลี่ยงที่ไม่ถูกต้อง 'x'
autopep8 ยังแก้ไขปัญหาบางอย่างที่ pycodestyle ไม่พบ
E301
.)E303
.)autopep8 หลีกเลี่ยงการแก้ไขปัญหาบางอย่างที่พบโดย pycodestyle
E112
/ E113
สำหรับการไม่แสดงความคิดเห็นคือรายงานการเยื้องที่ไม่ถูกต้องซึ่งละเมิดกฎไวยากรณ์ สิ่งเหล่านี้ไม่ควรได้รับการแก้ไขเลยE265
ซึ่งหมายถึงการเว้นวรรคหลังแฮชความคิดเห็น จะถูกละเว้นหากความคิดเห็นดูเหมือนโค้ด autopep8 หลีกเลี่ยงการแก้ไขสิ่งเหล่านี้เนื่องจากไม่ใช่ความคิดเห็นจริง หากคุณต้องการกำจัดคำเตือน pycodestyle จริงๆ ให้ลองลบโค้ดที่ใส่ความคิดเห็นออก (ซึ่งสามารถดำเนินการได้โดยอัตโนมัติผ่านการกำจัด) ตามค่าเริ่มต้น autopep8 จะทำการเปลี่ยนแปลงช่องว่างเท่านั้น ดังนั้นตามค่าเริ่มต้น จะไม่แก้ไข E711
และ E712
. (การเปลี่ยน x == None
เป็น x is None
อาจเปลี่ยนความหมายของโปรแกรมได้หาก x
มีการลบล้างเมธอด __eq__
) และไม่ได้แก้ไขโค้ดที่เลิกใช้แล้ว W6
หากต้องการเปิดใช้งานการแก้ไขเชิงรุกมากขึ้น ให้ใช้ตัวเลือก --aggressive
:
$ autopep8 -- ก้าวร้าว <ชื่อไฟล์>
ใช้หลายคำ --aggressive
เพื่อเพิ่มระดับความก้าวร้าว ตัวอย่างเช่น E712
ต้องการความก้าวร้าวระดับ 2 (เนื่องจาก x == True
สามารถเปลี่ยนเป็น x
หรือ x is True
แต่ autopep8 เลือกแบบแรก)
--aggressive
จะทำให้บรรทัดสั้นลงมากขึ้น นอกจากนี้ยังจะลบช่องว่างต่อท้ายอย่างจริงจังมากขึ้น (โดยปกติแล้ว เราจะไม่แตะช่องว่างต่อท้ายใน docstrings และสตริงหลายบรรทัดอื่นๆ และหากต้องการทำการเปลี่ยนแปลงเชิงรุกกับ docstrings มากขึ้น ให้ใช้ docformatter)
หากต้องการเปิดใช้งานเฉพาะชุดย่อยของการแก้ไข ให้ใช้ตัวเลือก --select
ตัวอย่างเช่น หากต้องการแก้ไขปัญหาการเยื้องประเภทต่างๆ ให้ทำดังนี้
$ autopep8 --select=E1,W1 <ชื่อไฟล์>
หากไฟล์ที่ได้รับการแก้ไขมีขนาดใหญ่ คุณอาจต้องการเปิดใช้งานข้อความความคืบหน้าแบบละเอียด:
$ autopep8 -v <ชื่อไฟล์>
การส่งผ่าน --experimental
จะเปิดใช้งานฟังก์ชันต่อไปนี้:
$ autopep8 --ทดลอง <ชื่อไฟล์>
คุณสามารถปิดการใช้งาน autopep8 ได้จนกว่าจะเปิดอีกครั้งในไฟล์ โดยใช้ autopep8: off
จากนั้นเปิดใช้งานอีกครั้งด้วย autopep8: on
# autopep8: off
[
[ 23 , 23 , 13 , 43 ],
[ 32 , 34 , 34 , 34 ],
[ 56 , 34 , 34 , 11 ],
[ 10 , 10 , 10 , 10 ],
]
# autopep8: on
fmt: off
และ fmt: on
ก็ใช้ได้เช่นกัน
วิธีที่ง่ายที่สุดในการใช้ autopep8 เป็นโมดูลคือผ่านฟังก์ชัน fix_code()
>>> import autopep8 >>> autopep8.fix_code( ' x= 123 n ' ) 'x = 123n'
หรือมีตัวเลือก:
>>> import autopep8 >>> autopep8.fix_code( ' print( 123 ) n ' , ... options = { ' ignore ' : [ ' E ' ]}) 'print( 123 )n'
ตามค่าเริ่มต้น หากมี $HOME/.config/pycodestyle
( ~.pycodestyle
ในสภาพแวดล้อม Windows) ไฟล์นั้นจะถูกใช้เป็นไฟล์การกำหนดค่าส่วนกลาง หรือคุณสามารถระบุไฟล์การกำหนดค่าส่วนกลางด้วยตัวเลือก --global-config
นอกจากนี้ หากมีไฟล์ setup.cfg
, tox.ini
, .pep8
และ .flake8
ในไดเร็กทอรีที่มีไฟล์เป้าหมายอยู่ ไฟล์นั้นจะถูกใช้เป็นไฟล์คอนฟิกูเรชัน
pep8
, pycodestyle
และ flake8
สามารถใช้เป็นส่วนได้
ตัวอย่างไฟล์การกำหนดค่า:
[ไพโค้ดสไตล์] ความยาวเส้นสูงสุด = 120 ละเลย = E501
autopep8 ยังสามารถใช้ pyproject.toml
ได้ ส่วนจะต้องเป็น [tool.autopep8]
และ pyproject.toml
มีความสำคัญเหนือกว่าไฟล์การกำหนดค่าอื่นๆ
ตัวอย่างไฟล์การกำหนดค่า:
[tool.autopep8] ความยาวเส้นสูงสุด = 120 ละเว้น = "E501,W6" # หรือ ["E501", "W6"] ในสถานที่ = จริง ซ้ำ = จริง ก้าวร้าว = 3
autopep8 สามารถใช้เป็น hook สำหรับการคอมมิตล่วงหน้าได้
หากต้องการเพิ่ม autopep8 เป็นปลั๊กอิน ให้เพิ่มคำจำกัดความ repo นี้ในการกำหนดค่าของคุณ:
repos :
- repo : https://github.com/hhatto/autopep8
rev : ... # select the tag or revision you want, or run `pre-commit autoupdate`
hooks :
- id : autopep8
กรณีทดสอบอยู่ใน test/test_autopep8.py
สามารถเรียกใช้โดยตรงผ่าน python test/test_autopep8.py
หรือผ่านทาง tox อย่างหลังมีประโยชน์สำหรับการทดสอบกับล่าม Python หลายตัว (ขณะนี้เราทดสอบกับ CPython เวอร์ชัน 3.8, 3.9, 3.10, 3.11 และ 3.12 นอกจากนี้เรายังทดสอบกับ PyPy ด้วย)
การทดสอบสเปกตรัมกว้างสามารถทำได้ผ่าน test/acid.py
สคริปต์นี้รัน autopep8 กับโค้ด Python และตรวจสอบความถูกต้องและความสมบูรณ์ของการแก้ไขโค้ด สามารถตรวจสอบว่ารหัสไบต์ยังคงเหมือนเดิม test/acid_pypi.py
ใช้ acid.py
เพื่อทดสอบกับแพ็คเกจที่ออกล่าสุดบน PyPI
pkg_resources.DistributionNotFound
หากคุณใช้ setuptools
เวอร์ชันเก่า คุณอาจพบ pkg_resources.DistributionNotFound
เมื่อพยายามเรียกใช้ autopep8
ลองอัปเกรด setuptools
เพื่อแก้ไขปัญหา setuptools
นี้:
$ pip install --upgrade setuptools
ใช้ sudo
หากคุณกำลังติดตั้งลงในระบบ