- ty ซึ่งเป็น ตัวตรวจสอบชนิดข้อมูลและภาษาเซิร์ฟเวอร์สำหรับ Python ความเร็วสูงมาก ที่เขียนด้วย Rust ได้เปิดตัวในเวอร์ชันเบตา
- ออกแบบมาให้เป็นทางเลือกแทน mypy, Pyright, Pylance และให้ ประสิทธิภาพเร็วกว่า 10~60 เท่า
- ใช้ สถาปัตยกรรมแบบ incremental โดยคำนวณใหม่เฉพาะส่วนที่จำเป็นเมื่อมีการแก้ไขโค้ด เพื่อเพิ่มความเร็วในการตอบสนองแบบเรียลไทม์ให้สูงสุด
- ให้ความสำคัญกับ ความแม่นยำและการใช้งาน โดยรองรับความสามารถของระบบชนิดข้อมูลสมัยใหม่ เช่น intersection types, advanced type narrowing และ reachability analysis
- Astral มีแผนพัฒนา ty ให้เป็นเครื่องมือพัฒนาหลักของ ecosystem Python ร่วมกับ Ruff และ uv
ภาพรวมของ ty
- ty คือ ตัวตรวจสอบชนิดข้อมูลและภาษาเซิร์ฟเวอร์สำหรับ Python ที่ Astral พัฒนาขึ้นและสร้างด้วย Rust
- ออกแบบมาให้เป็นทางเลือกที่เร็วกว่า mypy, Pyright, Pylance อย่างมาก
- ปัจจุบันมีการใช้งานอยู่แล้วในหลายโปรเจกต์ภายในของ Astral และในช่วงเบตาก็แนะนำให้ผู้ใช้ภายนอกเริ่มใช้งานได้
- Astral เป็นทีมที่สร้างเครื่องมือพัฒนาสมรรถนะสูงสำหรับ ecosystem Python และเป็นที่รู้จักจาก uv (ตัวจัดการแพ็กเกจ) และ Ruff (linter และ formatter)
ประสิทธิภาพและสถาปัตยกรรม
- ty ถูกออกแบบด้วย โครงสร้างที่ยึดภาษาเซิร์ฟเวอร์เป็นศูนย์กลาง และใช้ แนวทางการประมวลผลแบบ incremental ที่รันใหม่เฉพาะงานที่จำเป็นเมื่อมีการแก้ไขไฟล์
- ส่งผลให้การอัปเดตแบบเรียลไทม์ภายใน editor ทำได้รวดเร็วมาก
- แม้รันโดยไม่มีแคช ก็ยัง เร็วกว่า mypy และ Pyright 10~60 เท่า
- ตัวอย่าง: เมื่อแก้ไขไฟล์หลักใน repository ของ PyTorch ความเร็วในการคำนวณผลวินิจฉัยใหม่อยู่ที่ 4.7ms ซึ่งเร็วกว่า Pyright (386ms) 80 เท่า และเร็วกว่า Pyrefly (2.38 วินาที) 500 เท่า
- แม้ในโปรเจกต์ขนาดใหญ่ เมื่อเป็น การอัปเดตแบบ incremental ก็ยังมีช่องว่างด้านประสิทธิภาพมากกว่าหลายสิบเท่า
ระบบชนิดข้อมูลและความแม่นยำ
- ty รองรับ intersection types, advanced type narrowing, reachability analysis ตามชนิดข้อมูล เป็นต้น
- ความสามารถเหล่านี้ช่วยให้ให้ ฟีดแบ็กด้านชนิดข้อมูลที่แม่นยำ และลดการแจ้งเตือนผิดพลาดที่ไม่จำเป็น (false positive)
- เป้าหมายไม่ใช่แค่เพิ่มความเร็ว แต่คือการสร้าง ตัวตรวจสอบชนิดข้อมูลที่ปรับปรุงทั้งความแม่นยำและประสบการณ์ผู้ใช้
ระบบวินิจฉัย
- ty มี ระบบวินิจฉัยขั้นสูง ที่ได้รับแรงบันดาลใจจาก ระบบข้อความข้อผิดพลาดของคอมไพเลอร์ Rust
- ในข้อความวินิจฉัยเดียวสามารถแสดงบริบทจากหลายไฟล์ร่วมกัน เพื่อให้เห็นสาเหตุของปัญหาและแนวทางแก้ไขได้ชัดเจน
- ตัวอย่าง: เมื่อมีการกำหนดค่าให้คีย์ของ dictionary ไม่ถูกต้อง ระบบจะแสดงทั้งตำแหน่งที่ชนิดข้อมูลไม่ตรงกันและตำแหน่งที่มีการประกาศไว้
- เอาต์พุตการวินิจฉัยเป็นอินเทอร์เฟซหลักของ ty และถูกออกแบบให้ ทั้งมนุษย์และ AI เข้าใจได้ง่าย
ความสามารถของภาษาเซิร์ฟเวอร์
- ty ใช้งานได้กับ editor ทุกตัวที่รองรับ LSP (Language Server Protocol) เช่น VS Code, Cursor
- รองรับความสามารถของภาษาเซิร์ฟเวอร์สมัยใหม่ครบถ้วน เช่น Go to Definition, Rename Symbol, Autocomplete, Auto Import, Semantic Syntax Highlighting, Inlay Hints
- ติดตั้งได้ผ่าน ส่วนขยายของ VS Code และสามารถติดตั้ง CLI ได้ด้วยคำสั่ง
uv tool install ty@latest
แผนในอนาคต
- เป้าหมายระยะสั้นหลังเบตาคือ เพิ่มเสถียรภาพและแก้ไขบั๊ก, ทำสเปกชนิดข้อมูลของ Python ให้สมบูรณ์, และ รองรับ Pydantic กับ Django
- ในระยะยาวมีแผนขยาย ty ให้เป็น เอนจินฟีเจอร์เชิงความหมาย ของชุดเครื่องมือ Astral
- เตรียมเพิ่มความสามารถอย่าง การลบโค้ดที่ตายแล้ว, ตรวจจับ dependency ที่ไม่ได้ใช้งาน, การวิเคราะห์การเข้าถึงช่องโหว่ความปลอดภัย (CVE), การ lint ที่รับรู้ชนิดข้อมูล
- Astral ตั้งเป้าปรับปรุง ty อย่างต่อเนื่องเพื่อทำให้ Python เป็น ecosystem การเขียนโปรแกรมที่มีประสิทธิผลมากที่สุด
คำขอบคุณ
- การพัฒนา ty มีผู้มีส่วนร่วมจากโอเพนซอร์สหลายสิบคน และเปิดเผยภายใต้ MIT License
- บุคคลและทีมหลายรายจาก Salsa, Elixir, และ ชุมชน Python typing ได้ให้ความร่วมมือทางเทคนิคและแรงบันดาลใจ
- ทีมหลักของ Astral พัฒนา ty บนพื้นฐานความเข้าใจอย่างลึกซึ้งเกี่ยวกับ ทฤษฎีชนิดข้อมูล, ความหมายของ Python runtime, และ รูปแบบการใช้งานใน ecosystem
2 ความคิดเห็น
Astral เป็นสาย Python หรือสาย Rust กันแน่…
ช่าง Astral เสียจริง~
ความคิดเห็นจาก Hacker News
อยากให้เพิ่ม Ty เข้าไปในตารางเปรียบเทียบนี้
พอดูตารางผลลัพธ์ Python typing conformanceแล้ว คิดว่าไม่ควรประเมินความสามารถของ Pyright ต่ำเกินไป
ลองใช้ Ty (LSP) ใน Emacs อยู่พักหนึ่งแล้ว มันทำงานได้ค่อนข้างดีทีเดียว แต่มีจุดที่กวนใจนิดหน่อยคือตอนแสดงเมธอดซิกเนเจอร์ type annotation ของบางพารามิเตอร์ดู ยืดยาวเกินไป
ถึงอย่างนั้นในระยะยาวก็ค่อนข้างคิดว่าน่าจะใช้ Ty ขอแสดงความยินดีกับการออกเบต้าครั้งแรก
มันค่อนข้างห่างจากสิ่งที่ผู้ใช้จริงให้ความสำคัญ (ผมก็เป็นคนทำทั้งสเปกและเทสต์ร่วมกันใน Python Typing Council)
ถึงอย่างนั้นผมก็เป็นผู้ใช้ uv ที่พอใจมาก และถ้า Ty เสถียรพอก็คิดว่าจะย้ายไปใช้
Astral กำลังสร้างเครื่องมือที่ยอดเยี่ยม ก็หวังว่าจะเติบโตได้ดีโดยไม่ต้อง หารายได้แบบทำลายของเดิม
สุดท้ายก็มีกรณีที่ต้องย้อนกลับไปใช้เครื่องมือเดิม สำหรับผม การตรวจ type ที่ถูกต้องแม่นยำ สำคัญกว่าความเร็ว
ขอบคุณทีม Astral เราใช้ Pydantic หนักมาก เลยตื่นเต้นที่บอกว่าจะมีการรองรับระดับ first-class ใน Ty เวอร์ชันทางการ
ตอนนี้เรารันทั้ง Pyright และ Mypy ไปพร้อมกัน ซึ่งมันจับข้อผิดพลาดคนละแบบจนรู้สึกซ้ำซ้อน
ตามตารางนี้บอกว่า Pyright เป็น superset แต่จากประสบการณ์จริงของผมไม่เป็นแบบนั้น
นั่นเป็นการวิเคราะห์เมื่อ 2 ปีก่อน ตอนนี้อาจต่างออกไปก็ได้ อยากรู้ว่ามีกรณีที่รวมมาใช้ Pyright ตัวเดียวบนโค้ดเบสขนาดใหญ่หรือยัง
หลายครั้ง mypy อนุมานได้ยืดหยุ่นและแม่นยำกว่า ส่วน Pyright มี false positive เยอะจนผมเคยปิดมันไปเลย
ทุกวันนี้ Pyright อาจพัฒนาไปมากแล้ว แต่ BasedPyright กลับยิ่งทำให้ทำงานได้น้อยลง
ในชุมชนมีบรรยากาศชอบกด mypy ลงแล้วอวย Pyright กันมาก แต่ประสบการณ์ของผมค่อนข้างต่างออกไป
มันโฟกัสที่ semantic ของ annotation เป็นหลัก เลยไม่เหมาะจะใช้เป็นเกณฑ์เลือก type checker
(ผมเองก็ทำทั้งสเปกและเทสต์นี้ใน Python Typing Council)
คิดว่าชื่อควรเป็น “ประกาศ Ty Beta Release” มากกว่า
ผมชอบ Pyrefly มากกว่า Pyright แต่ช่วงนี้มีบั๊กจนต้องตรึงเวอร์ชันเก่าไว้เลยลำบาก
พอลองติดตั้ง Ty ก็เจอข้อผิดพลาดเรื่องความเข้ากันได้ของเวอร์ชัน Cursor
ยังไม่เข้าใจเลยว่าทำไมภาษาหนึ่งถึงยังมี type checker มากขนาดนี้
คนทำไลบรารีต้องทดสอบกับทุกตัวเลยไหม หรือว่านักพัฒนาควรใช้เฉพาะไลบรารีที่รองรับ checker ที่ตัวเองเลือก?
ตรงขอบเขตของแพ็กเกจจำเป็นต้องมี type แบบ explicit แต่ในโค้ดภายในจะมีความกำกวมเยอะ
โดยเฉพาะ Astral ตั้ง ประสิทธิภาพของ incremental processing เป็นเป้าหมายการออกแบบหลัก
ถ้าจำเป็นก็สามารถแจก type stub เองเพื่อให้เข้ากันได้
ชอบที่ Ty มีจุดยืนว่า “ไม่จำเป็นต้องเพิ่ม annotation เพื่อเอาใจ type checker”
checker รุ่นก่อน ๆ ชอบมากวนด้วยคำเตือนจุกจิก แต่ Ty จับ ข้อผิดพลาดเชิงตรรกะ จริง ๆ ได้ดี
วันนี้เพิ่งรู้ว่า Ty ทำหน้าที่เป็น language server (LSP) ได้ด้วย
แปลว่าใน Neovim หรือ VSCode มันอาจมาแทนทั้ง mypy และ Pyright ได้
อยากรู้ว่ารองรับ Django แค่ไหน Django มี โค้ดเชิง magic เยอะมากจน type checker จัดการยาก
ถ้าใช้ Django อยู่ ช่วงนี้น่าจะยังต้องใช้ mypy หรือ Pyright ต่อไปก่อน
ต่อให้ Ty ไม่เร็วมาก แต่แค่รองรับ intersection type (A & B) ก็ถือว่าน่าใช้แล้ว
ดีใจที่ได้เห็นฟีเจอร์ที่หายไปจากระบบ type มาตรฐานของ Python
สงสัยว่าใน Ruby มีอะไรคล้าย uv ไหม ใน Python หรือ TypeScript ผมใช้ uv หรือ bun แต่ Ruby ยังดูตามหลังอยู่