Augument Python 3 บทคัดย่อต้นไวยากรณ์ (ASTs) พร้อมข้อมูลประเภทคงที่
Python เป็นภาษาการเขียนโปรแกรมที่พิมพ์แบบไดนามิก อย่างไรก็ตามโดยทั่วไปแล้วรหัส Python จะใช้งานได้แม้ว่ามันจะพิมพ์แบบคงที่!
ด้วยแพ็คเกจนี้เราสามารถแทรกข้อมูลประเภทคงที่ลงในต้นไวยากรณ์นามธรรม Python (ASTs) ดังนั้นสมมติว่ารหัสที่กำหนดจะทำงานได้หาก Python ถูกพิมพ์แบบคงที่หนึ่งสามารถให้เหตุผลเกี่ยวกับประเภทในรหัสแบบคงที่ก่อนการดำเนินการ
AST ที่เพิ่มขึ้นดังกล่าวส่วนใหญ่มีไว้สำหรับการวิเคราะห์/การบริโภคโดยใช้เครื่องมืออื่น ๆ
ทำงานได้ดีที่สุดกับ ASTS จากโมดูล typed_ast แต่มันก็ใช้งานได้กับโมดูล ast ในตัว
โปรดทราบว่านี่เป็นงานต่อเนื่องและการดำเนินการในปัจจุบันอาจมีการเปลี่ยนแปลงอย่างฉับพลัน
การสนับสนุนของ typed_ast จะถูกลดลงหลังจาก Python 3.8 ถูกปล่อยออกมาเนื่องจากฟังก์ชั่นของมันจะถูกรวมเข้ากับตัวแยกวิเคราะห์ AST ในตัว
สารบัญ
คุณสามารถใช้โมดูล static_typing เพื่อแยกวิเคราะห์รหัสโดยตรงโดยใช้ฟังก์ชัน parse() :
import static_typing as st
class MyClass :
pass
module = st . parse ( 'def my_fun(obj: MyClass) -> MyClass: return obj' )
# TODO: currently there is no public API yet
functions = module . _functions
my_fun = module . _functions [ 'my_fun' ]
assert MyClass in my_fun . _params [ 'obj' ] หรือคุณสามารถเพิ่ม AST ที่มีอยู่โดยใช้ฟังก์ชัน augment() :
import static_typing as st
import typed_ast . ast3
module = typed_ast . ast3 . parse ( '''def spam(): x, y, z = 'ham', 42, 3.1415 # type: str, int, float''' )
module = st . augment ( module )
# TODO: currently there is no public API yet
function = module . _functions [ 'spam' ]
assert len ( function . _local_vars ) == 3
assert float in function . _local_vars [ 'z' ]สำหรับตัวอย่างเพิ่มเติมดูตัวอย่างสมุดบันทึก IPYNB
นอกจากนี้คุณสมบัติหลักไลบรารียังมีโมดูล static_typing.ast_manipulation ซึ่งมีเครื่องมือระดับต่ำและการสร้างบล็อกที่อนุญาตให้:
typed_ast ถึง AST ใน ast และในทางกลับกัน) และ กระบวนการหรือการพิมพ์แบบคงที่ซึ่งฟังก์ชั่น augment() ใช้งานมี 3 ขั้นตอนหลัก:
ในโหนดที่เกี่ยวข้องทั้งหมดคำแนะนำประเภทจะถูกเก็บไว้ในฟิลด์ type_comment , annotation และ returns ตัวแก้ไขคำใบ้ประเภทอ่านฟิลด์เหล่านั้น - ซึ่งพวกเขาเป็นสตริงดิบหรือ ASTS
มันใช้ตารางสัญลักษณ์ Python ที่ให้ไว้เพื่อแก้ไขคำแนะนำประเภทเป็นวัตถุประเภทจริงโดยใช้การวิปัสสนา
โดยค่าเริ่มต้นตัวแก้ไขใช้สัญลักษณ์ในตัวเมื่อเรียกโดยตรงหรือผ่าน augment() อย่างไรก็ตามเมื่อเรียกผ่าน parse() จะใช้ globals() และ locals() ของผู้โทรตามค่าเริ่มต้น
คำแนะนำประเภทที่ได้รับการแก้ไขจะถูกเก็บไว้โดยตรงใน AST โดยเฉพาะอย่างยิ่งฟิลด์ที่ได้รับการแก้ไขแต่ละฟิลด์จะถูกเก็บไว้ในฟิลด์ที่มีชื่อตามลำดับซึ่งเป็น resolved_type_comment , resolved_annotation หรือ resolved_returns
ดังนั้นข้อมูลประเภทคงที่จะมีอยู่ใน AST
สำหรับแต่ละโหนด AST ที่อาจมีการประกาศชื่อใด ๆ จะมีการจัดทำโหนดเวอร์ชันที่ออกไป แต่ละโหนด AST ขยายมีฟิลด์ใหม่ที่เก็บชื่อและพิมพ์ข้อมูลที่เกี่ยวข้องกับแต่ละชื่อ
ฟิลด์ใหม่เหล่านี้เก็บข้อมูลทุกประเภทจากคำแนะนำทุกประเภทที่ได้รับการแก้ไขภายในขอบเขตท้องถิ่นใด ๆ เพื่อให้สามารถตรวจพบประเภทความขัดแย้งหรือการขาดข้อมูลประเภทได้ นอกจากนี้ตามข้อมูลที่รวมกันนี้สามารถทำการอนุมานประเภทได้
โดยเฉพาะอย่างยิ่งมีการจัดเตรียมโหนด AST ต่อไปนี้ด้วยฟิลด์ใหม่: Module , FunctionDef , ClassDef , Assign , AnnAssign , For และ With เวอร์ชันใหม่เหล่านั้นมีชื่อของพวกเขานำหน้า StaticallyTyped...
รายการเอนทิตีที่รวบรวมข้อมูลในสาขาใหม่เหล่านั้นตามมา
สำหรับ Module :
สำหรับ FunctionDef :
สำหรับ ClassDef :
สำหรับ Assign และ AnnAssign :
For :
สำหรับ With :
การเขียนใหม่ AST หมายถึงการแทนที่โหนด AST ธรรมดาที่ระบุไว้ข้างต้นด้วยเวอร์ชันขยายของพวกเขา
Python เวอร์ชัน 3.5 หรือใหม่กว่า
ไลบรารี Python ตามที่ระบุไว้ในข้อกำหนด. txt
การสร้างและการทดสอบการทำงานยังต้องใช้แพ็คเกจที่ระบุไว้ใน test_requirements.txt
ทดสอบบน Linux และ Windows