เปรียบเทียบ Pyrefly และ Ty: ตัวตรวจสอบชนิดข้อมูล Python รุ่นใหม่ที่สร้างด้วย Rust
(blog.edward-li.com)- ไม่นานมานี้มีการเปิดตัวตัวตรวจสอบชนิดข้อมูล Python ที่สร้างด้วย Rust สองตัว ได้แก่ Pyrefly ของ Meta และ Ty ของ Astral ซึ่งแสดงให้เห็นทั้ง ประสิทธิภาพที่เหนือกว่ามาก เมื่อเทียบกับ mypy และ pyright เดิม รวมถึง แนวทางพาราไดม์การทำ typing แบบใหม่
- Pyrefly มุ่งไปที่ การอนุมานชนิดข้อมูลเชิงรุก และแนวทางโอเพนซอร์ส ขณะที่ Ty นำหลักการ “** gradual guarantee**” มาใช้ โดยให้ความสำคัญกับการลดการเกิด type error ให้มากที่สุด
- แม้ทั้งสองเครื่องมือยังอยู่ใน เวอร์ชันอัลฟาระยะแรก แต่ผลเบนช์มาร์กจากหลายโปรเจ็กต์แสดงให้เห็นว่า Ty ทำความเร็วเฉลี่ยได้สูงกว่า
- ในด้าน incremental analysis นั้น Pyrefly ใช้การแยกเพิ่มระดับโมดูล ส่วน Ty ให้การแยกเพิ่มแบบละเอียดถึงระดับฟังก์ชัน จึงมีความต่างทั้งด้านการใช้งานและโครงสร้าง
- Ty นำเสนอระบบชนิดข้อมูลที่ล้ำหน้า เช่น intersection types และ negation types พร้อมทั้งมี ข้อความ error ที่เข้าใจง่ายและชัดเจนกว่า
แนะนำ Pyrefly และ Ty
- Pyrefly และ Ty เป็นตัวตรวจสอบชนิดข้อมูล Python ที่พัฒนาด้วย Rust
- Pyrefly พัฒนาโดย Meta (ชื่อเดิม Facebook) และเข้ามาแทนที่ Pyre ที่สร้างด้วย OCaml
- Ty พัฒนาโดย Astral ซึ่งเป็นที่รู้จักจากเครื่องมือ Python อย่าง uv และ ruff
- ทั้งสองโปรเจ็กต์เปิดเป็นโอเพนซอร์สแล้ว แต่ยังอยู่ใน ขั้นอัลฟาก่อนเปิดตัวอย่างเป็นทางการ
- ทั้งสองทีมได้นำเสนอวิสัยทัศน์ เป้าหมาย และแนวทางของตนในงาน PyCon 2025 Typing Summit
จุดเหมือนกัน
- ทั้งคู่พัฒนาด้วย Rust และรองรับ incremental checking
- ใช้ ruff ในการ parse AST ของโค้ด Python
- เชื่อมต่อกับสภาพแวดล้อมการพัฒนาได้ดี ทั้งการตรวจชนิดข้อมูลผ่าน command line และการทำงานร่วมกับ LSP/IDE
ความแตกต่าง 1: ความเร็ว
เบนช์มาร์ก PyTorch
- Ty เร็วกว่า Pyrefly ราว 2~3 เท่า และทั้งคู่ก็เร็วกว่า mypy กับ pyright เดิมประมาณ 10~20 เท่า
- Pyrefly ตั้งเป้าปรับปรุงประสิทธิภาพให้เร็วกว่า Pyre 35 เท่า และเร็วกว่า mypy/pyright 14 เท่า
- Ty ถูกออกแบบมาโดยมีเป้าหมายให้เร็วกว่า type checker รุ่นปัจจุบัน 1–2 หลัก
เบนช์มาร์ก Django
- Ty เร็วที่สุด โดยมี Pyrefly ตามมาเป็นอันดับถัดไป
- Pyright ให้ผลลัพธ์ที่ช้ากว่าอย่างชัดเจน
เบนช์มาร์ก repository ของ mypy
- ได้ผลลัพธ์คล้ายกัน โดย Ty เร็วที่สุด และ Pyrefly ตามหลังมาแบบต่างกันไม่มาก
- mypy และ pyright ใช้เวลาประมวลผลช้ากว่าอย่างเห็นได้ชัด
ความแตกต่าง 2: เป้าหมายด้าน typing
Pyrefly
- มุ่งใช้กลยุทธ์ อนุมานชนิดข้อมูลให้ได้มากที่สุด เพื่อจับข้อผิดพลาด แม้โค้ดจะไม่ได้ระบุชนิดข้อมูลไว้อย่างชัดเจน
- เน้น การอนุมานชนิดข้อมูลเชิงรุกมากขึ้น เพื่อยกระดับความเสถียรของโค้ดให้สูงสุด
Ty
- ใช้หลัก Gradual guarantee
- ออกแบบมาเพื่อไม่ให้เกิด type error เมื่อเอาชนิดข้อมูลแบบ explicit ออกจากโค้ดที่ทำงานได้อยู่แล้ว
- ไม่ทำให้เกิด error เพียงเพราะไม่มี type annotation และจะขอ annotation เพิ่มเมื่อจำเป็นเท่านั้น
- ตัวอย่างเช่น ต่อให้กำหนดค่าให้ฟิลด์ที่ไม่มี explicit type ก็จะไม่เกิด type error แต่จะจัดการเป็น
'Unknown | None'เป็นต้น
ความแตกต่าง 3: วิธีทำ incremental analysis
- Pyrefly: วิเคราะห์ใหม่เฉพาะไฟล์ (โมดูล) ที่เปลี่ยนและโมดูลที่พึ่งพาอยู่เท่านั้น (incremental ระดับโมดูล)
- Ty: ใช้เฟรมเวิร์ก Salsa ของ Rust เพื่อทำ incremental แบบละเอียดถึง ระดับฟังก์ชัน
- ฝั่งหนึ่งมองว่าระดับโมดูลก็เร็วเพียงพอแล้ว ขณะที่อีกฝั่งเลือกระดับฟังก์ชัน แม้อาจทำให้ codebase ซับซ้อนขึ้น (เป็นความต่างด้านกลยุทธ์ของแต่ละเครื่องมือ)
ความแตกต่าง 4: ฟีเจอร์ (ระบบชนิดข้อมูลและการรองรับ)
จุดเด่นของ Pyrefly
- การอนุมานชนิดข้อมูลแบบ implicit ทำได้ทรงพลังมาก
- แม้ไม่มี explicit type ก็ยังวิเคราะห์ชนิดข้อมูลที่ซับซ้อน เช่น ค่าที่คืนจากฟังก์ชัน, dictionary, list และตรวจจับ error ได้
- ออกแบบโดยให้ความสำคัญกับ ปัญหา typing ที่ซับซ้อน เช่น generic, overload และ wildcard import
- มีความแม่นยำในการอนุมาน generic type สูงกว่า Ty
จุดพิเศษของ Ty
- ด้วย “gradual guarantee” จึงยอมให้ชนิดข้อมูลเปลี่ยนได้อย่างอิสระเมื่อไม่มี explicit type
- รองรับระบบชนิดข้อมูลที่ล้ำหน้า เช่น intersection types และ negation types
- ข้อความ error ถูกออกแบบมาให้ชัดเจนและเข้าใจง่ายมาก
- อนุญาตให้กำหนดชนิดข้อมูลหลากหลายแบบลงใน list ฯลฯ ได้อย่างอิสระ และนำค่า
Unknownเข้ามาเป็นส่วนหนึ่งของระบบชนิดข้อมูล
ข้อจำกัด / สถานะอัลฟา
- ทั้งสองผลิตภัณฑ์ยังอยู่ใน ขั้นอัลฟา ทำให้การอนุมานชนิดข้อมูลหรือบางฟีเจอร์ยังไม่สมบูรณ์
- ตัวอย่างเช่น การอนุมานชนิดข้อมูลของ list ใน Ty บางกรณียังไม่สมบูรณ์นัก
เปรียบเทียบฟีเจอร์เชิงลึก
การอนุมานชนิดข้อมูลแบบ implicit
- Pyrefly อนุมานชนิดข้อมูลของค่าที่คืนกลับและคอลเลกชันได้อย่างกระตือรือร้น พร้อมแสดง revealed type และ error อย่างชัดเจน
- Ty จะคืนค่าเป็น
Unknownหรือ@Todoเมื่อ inference ยังไม่เพียงพอ
Generic
- ทั้ง Pyrefly และ Ty จัดการปัญหา generic type ทั่วไปได้ดี
- Pyrefly เหนือกว่าในการตีความชนิดข้อมูลของ instance ที่ถูกสร้างขึ้นโดยไม่มี type parameter
- แต่ทั้งสอง checker ยังดูด้อยกว่า mypy และ pyright ในประเด็น covariance/contravariance
ข้อความ error
- Ty ให้ความสำคัญกับ ข้อความ error ที่กระชับและอ่านง่าย
- เมื่อเทียบกับ Pyrefly, mypy และ pyright แล้ว ข้อความของ Ty เข้าใจได้ง่ายกว่าในทันที
Intersection / Negation types
-
มีเพียง Ty เท่านั้นที่รองรับ intersection types (
&) และ negation types (~) เพื่อจัดการการคำนวณชนิดข้อมูลที่ซับซ้อนแบบด้านล่าง- ตัวอย่าง: ในชนิดข้อมูล
WithX | Otherหากมีแอตทริบิวต์xอยู่ Ty จะทำ branching ไปเป็น WithX โดยอัตโนมัติ - ตัวอย่าง: หากไม่ใช่ subclass เฉพาะตัวหนึ่ง ก็จะตีความชนิดข้อมูลเป็น
MyClass & ~MySubclass
- ตัวอย่าง: ในชนิดข้อมูล
-
intersection และ negation types ลักษณะนี้ถือเป็นฟีเจอร์ที่ก้าวหน้ามากในเชิงทฤษฎีชนิดข้อมูล
ตัวอย่างขั้นสูงอื่น ๆ
- Ty สามารถนำระบบชนิดข้อมูลไปใช้กับการคำนวณซับซ้อน เช่น สมการไดโอแฟนไทน์ ได้ด้วย
- ชุดทดสอบเขียนอยู่ในเอกสาร Markdown (อ้างอิง: mdtest resource ของ Astral ruff)
บทสรุปและแนวโน้ม
- ตอนนี้ ecosystem ของ Python มี type checker แบบใหม่ที่ทั้งเร็วอย่างมากและมีแนวคิดใหม่ ปรากฏขึ้นแล้ว
- Ty เลือกใช้กลยุทธ์หลักเป็น ความปลอดภัยของชนิดข้อมูลแบบค่อยเป็นค่อยไป ส่วน Pyrefly เน้น การอนุมานชนิดข้อมูลเชิงรุก
- ทั้งสองเครื่องมือยังอยู่ในช่วงเริ่มต้น จึงยังมีโอกาสสูงที่ฟีเจอร์จะค่อย ๆ บรรจบกันหรือพัฒนาไปอีกมาก
- สามารถลองใช้งานได้จากเว็บไซต์ทางการ และยังมีปลั๊กอินสำหรับเอดิเตอร์หลักอย่าง VSCode และ Cursor ให้ใช้งาน
- ยังมีข่าวลือว่าในอนาคต Google อาจโอเพนซอร์ส type checker ที่สร้างด้วย Go เช่นกัน ทำให้วงการการวิเคราะห์ชนิดข้อมูลของ Python น่าจะยิ่งหลากหลายขึ้น
การใช้งาน / อ้างอิง
- Pyrefly: pyrefly.org/sandbox
- Ty: play.ty.dev
- Ty ของ Astral ใช้การทดสอบแบบอิง Markdown (ดูรายละเอียดเส้นทางได้จาก mdtest ใน repo ของ ruff)
- มีทั้งเอกสารทางการ, ปลั๊กอินเอดิเตอร์ และคำสั่งติดตั้งแพ็กเกจให้พร้อมใช้งาน
2 ความคิดเห็น
ดูเหมือนว่า
tyจะถือว่าเป็นunknownเสมอถ้าฟังก์ชันที่ใช้งานไม่ได้ระบุ return type ไว้ และจะตรวจให้ก็ต่อเมื่อบันทึกเท่านั้นส่วน
pyreflyถึงไม่ระบุก็ยังอนุมานให้ได้ และตรวจให้ได้ระหว่างพิมพ์ด้วยความเห็นจาก Hacker News
ในฐานะผู้พัฒนา ty เน้นว่ายินดีที่ ty และ pyrefly ได้รับความสนใจมากขึ้น แต่ก็ขอย้ำอีกครั้งว่าทั้งสองโปรเจ็กต์ยังไม่เสร็จสมบูรณ์ทั้งหมด ยังมีตัวอย่างที่เกิดจากฟีเจอร์ที่ยังไม่ถูกพัฒนาอยู่ ดังนั้นเวลารู้สึกว่า “นี่มันแปลกนะ” ก็อาจเป็นเพราะส่วนนั้นยังทำไม่เสร็จก็ได้ และต้องเข้าใจด้วยว่า Python เป็นภาษาที่ใหญ่มากและหลากหลายมาก
มีความเห็นว่าชอบวิธีทดสอบสไตล์ markdown ของ ty มาก เพราะตัวทดสอบทำหน้าที่เป็นเอกสารไปด้วย เป็นไอเดียที่ยอดเยี่ยมมาก และสงสัยว่าแนวคิดนี้ได้แรงบันดาลใจจากตัวอย่างโค้ดในเอกสารของ Rust หรือไม่
ขำกับการใช้
@TODOเพื่อทำเครื่องหมายส่วนที่เปิดเผยชนิดข้อมูล แต่พอคิดดูแล้วก็รู้สึกว่าเป็นลูกเล่นที่ฉลาดและมีประโยชน์มากในฐานะคนที่มีประสบการณ์กับ TypeScript มองว่าน่าสนใจกับความพยายามหลากหลายด้าน เช่น type inference, type narrowing และพฤติกรรมที่ต่างกันไปของตัวตรวจสอบชนิดข้อมูลแต่ละตัวของ Python ยังคงรู้สึกว่าจำเป็นต้องมี type checker ที่ทั้งเร็วและเชื่อถือได้ และ Python ดูจะตามหลังมากในด้านนี้ คิดว่า type checker ควรช่วยเพิ่มทั้งผลิตภาพและความน่าเชื่อถือของโค้ด จึงเอาใจช่วยโปรเจ็กต์เหล่านี้
จากมุมมองของนักพัฒนา Rust มีคำถามเรื่อง “ภาษา scripting สำหรับ Rust” ว่ามีชุมชนหรือเครือข่ายที่กำลังศึกษาภาษาซึ่งมีไวยากรณ์เข้ากับ Rust ได้ดี สามารถ import ชนิดข้อมูลของ Rust ได้แบบ native และคอมไพล์/ทำ hot reload ได้รวดเร็วหรือไม่ หรือ Python อาจทำหน้าที่นี้แทนได้แม้ไวยากรณ์จะแตกต่างกันก็ได้ พร้อมแนบลิงก์ที่เกี่ยวข้อง https://news.ycombinator.com/item?id=44050222
ความเห็นจากคนนอกที่ไม่ได้มีประสบการณ์กับ Python มากนักว่า ถ้าสนใจการใช้ type hint ควรลองดูโพสต์ใน Reddit https://www.reddit.com/r/Python/comments/10zdidm/why_type_hinting_sucks/ แต่ก็ไม่ควรจริงจังกับโพสต์นั้นมากเกินไป โดยเน้นว่าต่อให้มีเครื่องมือด้าน type ที่ดีแค่ไหน “แนวปฏิบัติที่ดี” ก็ต้องมาก่อน ยกตัวอย่างว่าถ้าจะให้เกิดการใช้งานอย่างสม่ำเสมอและมี strict type check ได้ใน codebase ขนาดใหญ่อย่าง Django หรือ Meta ก็ต้องทำให้นักพัฒนายึดตามธรรมเนียมที่แนะนำ Python ก็เหมือน C++ ตรงที่มีฟีเจอร์มากเกินไปและมี runtime ที่ผ่อนปรนมาก จนสุดท้ายต้องเลือกใช้เพียงบางส่วนอย่างจำกัดเพื่อให้ดูแลง่าย แต่ส่วนที่จำกัดนั้นก็อาจต่างกันไปตามคนและวัตถุประสงค์ พร้อมเปรียบเทียบกับกรณีที่นักพัฒนา Rust ปะทะกับนักพัฒนา Linux kernel เพราะระบบ type ที่เข้มงวดกว่า
ในคอมเมนต์ยอดนิยมของโพสต์ Reddit ดังกล่าว มีการปัดประเด็นด้วยแนวคิดประมาณว่า “ก็ใช้
Anyสิ งั้นการถกเถียงก็ไม่มีความหมาย” แต่จากกรณีจริง ถ้ามีการประกาศชนิดข้อมูลที่ชัดเจนกว่านี้ ก็จะช่วยป้องกันข้อผิดพลาดล่วงหน้าจากการเปลี่ยนแปลงของฟังก์ชันในไลบรารีหรือค่าป้อนเข้าที่ไม่คาดคิดได้ จึงมีข้อยืนยันอย่างหนักแน่นว่าถ้าอยากให้โค้ด Python ดูแลรักษาได้และเชื่อถือได้ การตรวจสอบชนิดข้อมูลเป็นสิ่งจำเป็นสรุปว่าการทุ่มเวลาและแรงไปกับ type check ของ Python มากเกินไป อาจสู้ย้ายไปใช้ภาษาที่มี static typing และเหมาะสมกว่าโดยตรง แล้วใช้ Python เฉพาะส่วนที่จำเป็นผ่าน interop layer จะดีกว่า แม้จะไม่ใช่ทางเลือกที่ทำได้เสมอไป แต่ก็รู้สึกว่าเสียเวลากับการพยายามฝืน Python มากเกินไป
วิจารณ์ว่าความสามารถอันทรงพลังและซับซ้อนของ Python (เช่น meta class, descriptor, การใช้
__call__,object.__new__, name mangling,self.__dict__) มีความเป็นเวทมนตร์มากเกินไปจนทำให้ความอ่านง่ายของโค้ดลดลงมาก และประกาศว่าตัวเองจะไม่ใช้ฟีเจอร์พวกนี้สงสัยว่าการออกความเห็นทั้งที่ไม่ได้ใช้งานภาษาจริง ๆ นั้นมาจากไหน เพราะนักพัฒนา Python เข้าใจภาษาอย่างลึกซึ้งผ่านการใช้งานจริงอยู่แล้ว จึงแปลกใจกับการที่คนไม่ใช้ภาษามาวิจารณ์ภาษาโดยอ้างเหตุผลจากภายนอก และชี้ให้เห็นบรรยากาศการถกเถียงด้วยตัวอย่างที่ถูกสร้างขึ้นมาแบบฝืน ๆ
ในฐานะคนที่ใช้ Python มาหลายปี ยืนยันว่าความผิดพลาดใหญ่ที่สุดคือการไม่ใช้ type hint และ type checker เลยตั้งแต่แรก
สนใจแนวคิด “gradual guarantee” ของ ty คือแม้จะลบ type annotation ออกหนึ่งตัวก็ไม่ควรทำให้เกิด type error ซึ่งฟังดูน่าสนใจ และคิดว่าน่าจะเป็นแนวทางที่เหมาะกับ Python ที่มีโค้ดแบบ dynamic จำนวนมากที่สุด
ย้อนความว่าระบบ gradual typing คือโครงสร้างที่แม้จะมี “any” (ชนิดที่ยังไม่แน่ชัด) อยู่ตรงไหนในโค้ดก็อาจไม่มีคำเตือนเลย ทำให้แม้แต่โค้ดสำคัญก็ไม่ได้รับการคุ้มครองด้วย type safety อย่างแท้จริง ประสบการณ์กับ mypy ก็พบว่านี่เป็นปัญหาร้ายแรง และรู้สึกว่าควรมีความสามารถในการประกาศว่า “ไฟล์นี้จะถูกตรวจชนิดข้อมูลแบบ static อย่างสมบูรณ์” มองว่า “gradual” typing ค่อนข้างใกล้เคียงกับ anti-pattern เสียด้วยซ้ำ และคำว่า “soft typing” อาจเหมาะกว่า
มองว่าใน codebase เดิมที่มีอยู่ก่อนแล้ว ไม่มีทางเลือกอื่นนอกจาก gradual typing จริง ๆ จากประสบการณ์ที่เคยใส่ type hint ให้กับ legacy Python codebase หลายแห่งด้วย mypy พบว่า “การ opt-in ระดับโมดูล” สมเหตุสมผลที่สุด ถ้า pyrefly ไม่รองรับเรื่องนี้ก็น่าจะมีข้อจำกัดด้านการใช้งานจริง อย่างไรก็ตาม ถ้ามองจากมุมของการสร้างโค้ดด้วย llm (โมเดลภาษาขนาดใหญ่) type checker ที่เร็วมากและเข้มงวดก็ยังมีประโยชน์
คล้ายกับช่วงแรกของการนำ Typescript มาใช้ คือให้ความสำคัญกับการ onboarding แบบนุ่มนวลสำหรับโปรเจ็กต์ขนาดใหญ่ที่มีอยู่เดิม แล้วค่อย ๆ เปิด
noImplicitAnyหรือstrictเป็นรายโมดูล เพื่อเปลี่ยนไปสู่สภาพแวดล้อมที่ตรวจสอบชนิดข้อมูลได้เข้มแข็งในที่สุดแม้ในฐานะโปรแกรมเมอร์ Rust ก็ยังคิดว่า “gradual guarantee” เป็นแนวคิดที่สมเหตุสมผลที่สุด
ระบุว่าการรองรับ gradual typing แบบนี้ไม่ดึงดูดตัวเองเท่าไร เพราะเดิมทีระบบ dynamic type ของ Python ก็ดูไม่น่าไว้วางใจอยู่แล้ว และครึ่งหนึ่งของเหตุผลที่เพิ่ม type annotation ก็เพื่อควบคุมพฤติกรรมที่ผิดพลาดเหล่านั้น จึงอยากได้ตัวเลือกอย่าง no-implicit-any หรือ strict mode อย่างยิ่ง
เครื่องมือของ Astral นำพลังสดใหม่มาสู่ ecosystem ของ Python ก็จริง แต่ก็มีคำถามเรื่อง “มุมมองระยะยาว” ว่าต่อไปจะถูกรวมเข้า Python โดยตรงไหม จะหายไปในอีก 5 ปีหรือไม่ หรือจะกลายเป็นการ rug pull แบบสมัครสมาชิกหรือเปล่า
มีความเป็นไปได้สูงว่า Astral อาจใช้ Business Source License เพื่อผลักดันให้การ deploy production ที่ใช้เครื่องมือของ Astral ต้องพึ่งการสมัครใช้งานระดับองค์กรหรือรูปแบบคล้ายกัน แม้ผลิตภัณฑ์ปัจจุบันจะยังไม่ตรงจุดนั้นนัก แต่จากมุมของการลงทุนแบบ venture capital ก็ดูมีแนวโน้มจะไปในทิศทางนี้
ในประกาศอย่างเป็นทางการ Astral ระบุชัดว่าจะขายบริการหลากหลายอย่างบนเครื่องมือเหล่านี้ พร้อมลิงก์อ้างอิง https://astral.sh/blog/announcing-astral-the-company-behind-ruff
จริง ๆ แล้วความกังวลแบบนี้ไม่ได้ใช้ได้กับ Astral เท่านั้น แต่ใช้ได้กับทุกโปรเจ็กต์ และโดยเฉพาะ tooling จาก Facebook ก็มีความเสี่ยงสูงที่จะถูกปล่อยทิ้งไม่ดูแลเมื่อเวลาผ่านไป สุดท้ายผู้ใช้ก็ต้องยอมรับความเสี่ยงด้วยตัวเองเสมอ
อ้างความเห็นของผู้ใช้รายหนึ่งใน reddit ว่าโมเดลพื้นฐานของ VC ท้ายที่สุดคือหวังให้ถูก FAANG เข้าซื้อ หรือขยายให้ใหญ่พอจะไปสู่การ “acqui-hire” และ Astral ก็อาจลงเอยด้วยสถานการณ์แบบถูกควบรวมแล้วคนเก่งย้ายเข้าไปทำงาน เป็นต้น
มีข่าวลือว่าเมื่อไม่นานมานี้ Astral กำลังเตรียมเครื่องมือสำหรับองค์กรขนาดใหญ่ เช่น private package registry แบบโฮสต์ให้
ในตัวอย่าง “my_list = [1, 2, 3]” นั้น mypy, pyrefly และ pyright มองว่า
my_list.append("foo")เป็น type error แต่มีเพียง ty ที่ยอมให้ผ่านได้โดยไม่ต้องประกาศอะไรเพิ่มเติม จึงมีข้อโต้แย้งว่าในงานจริงนั้นการใช้ list ที่มีชนิดเดียวกันตลอดเป็นเรื่องปกติ ดังนั้น type checker ก็ควรตั้งต้นจากสมมติฐานนี้ และไม่ควรทำให้การตรวจชนิดข้อมูลอ่อนแอลงเพียงเพราะ Python อนุญาต พร้อมวิจารณ์แรงว่าเหมือนเป็นนโยบายที่ออกแบบมาสำหรับโค้ดของมือใหม่มากเกินไปผู้พัฒนา ty อธิบายว่า “ตอนนี้ type inference ของ list literal ยังไม่เสร็จสมบูรณ์” ปัจจุบันยังใช้เพียง
list[Unknown]ซึ่ง Unknown เป็น gradual type คล้าย Any จึงทำให้ append อะไรก็ได้ทั้งหมด มีแผนจะทำ inference ให้ละเอียดขึ้นในอนาคต และแนบลิงก์ issue ที่เกี่ยวข้อง https://github.com/astral-sh/ty/issues/168มีความเห็นว่านี่ไม่ใช่การ optimize เพื่อผู้เริ่มต้น แต่เป็นสิ่งที่เลี่ยงไม่ได้เพื่อให้เข้ากันได้กับ legacy code เพราะถ้าจะนำ type checker เข้าไปใช้กับโค้ดจำนวนมากที่ยังไม่มี type ก็ต้องทำให้โค้ดเดิมทำงานได้ใกล้เคียงเดิมที่สุดเพื่อลดภาระ
มีข้อโต้แย้งว่า “การจะสร้าง tooling โดยเมินสิ่งที่ Python อนุญาต แล้วใช้ความเห็นส่วนตัวเป็นหลักนั้นฟังไม่ค่อยขึ้น”
มีการชี้ว่าปัญหาของแนวทาง pyrefly คือ “นำไปใช้ทั้งชุดกับ codebase ขนาดใหญ่ที่ไม่มี type ได้ยาก” เพราะต้องแก้โค้ดทีละจุด และถ้าในองค์กรไม่มีฉันทามติเรื่องงานนี้ก็ยิ่งทำได้ยาก เหมาะกับที่อย่าง Meta ที่บังคับภายในได้มากกว่า แต่ถ้าคิดถึงการนำมาใช้แบบค่อยเป็นค่อยไป แนวทางที่ผ่อนปรนกว่าอย่าง ty ก็ดูสมจริงกว่า ขณะเดียวกันส่วนตัวก็ยังชอบเครื่องมือที่เตือนเรื่อง mixed type มากกว่าเช่นกัน
มีความเห็นว่า “ถ้าเป็นโค้ด Python ที่รันได้จริง ก็ควรจะไม่เกิด type error เว้นแต่จะมีการจำกัดชนิดไว้อย่างชัดเจน” และถ้าต้องการ static subset ที่เข้มงวดกว่านี้ ก็ควรเพิ่ม type annotation ด้วยตัวเอง
มีผู้มีประสบการณ์เห็นว่าแนวทางของ Pyrefly ที่มุ่งไปทาง type inference ที่เข้มแข็งกว่านั้น ทำให้ในโค้ดขนาดใหญ่ที่ต้องการ type safety จริง จำนวน annotation ที่ต้องเขียนลดลงมาก แม้จะเริ่มต้นใช้งานยากกว่าแต่ระยะยาวมีประสิทธิภาพกว่า และมองว่า ty ในทางปฏิบัติก็แทบจะเป็นสถานะที่ปิด
noImplicitAnyไว้มีความคาดหวังอยากได้ type checker ที่รองรับการผสานกับ notebook (live coding) อย่างจริงจัง เพราะการตรวจแบบ static เพื่อจับข้อผิดพลาดก่อนรัน cell ยาว ๆ จะช่วยเพิ่มประสิทธิภาพอย่างมาก
มีการถามถึงประสบการณ์ใช้ Jupyter notebook ใน VSCode และชี้ว่าการใช้ type checker อย่าง pylance กับโค้ดทดลองอาจกลายเป็นสิ่งรบกวนได้ด้วย
มีคำแนะนำให้ลองประสบการณ์ของ Language Server ใน VSCode ซึ่งให้ feedback ได้ทันทีทั้งสำหรับ notebook integration และ live coding โดยอธิบายว่าสามารถตอบโจทย์ความต้องการด้านการตรวจชนิดข้อมูลแบบ interactive ได้
มองว่าการออกแบบของ Pyrefly คล้ายแนวทาง type inference ของ Typescript มากกว่า จึงรู้สึกว่าสมเหตุสมผลกว่าสำหรับตัวเอง และประเมินว่าการนำมาใช้แบบ gradual ในระดับโมดูลคืออุดมคติ ถ้าลงไปถึงระดับฟังก์ชันจะยิบย่อยเกินไปและเกินความจำเป็น อีกทั้งในแง่ประสิทธิภาพก็คิดว่าระดับโมดูลเพียงพอแล้ว
แม้โปรเจ็กต์จะมีความเป็น dynamic สูง ก็ยังคิดว่าตัวเองน่าจะเลือกแนวทางที่มี type inference เข้มแข็งกว่าแบบ Pyrefly แม้จะมีความไม่สะดวกตามมาบ้างก็ตาม
ตอนนี้ใช้ basedpyright ในทั้ง IDE และสภาพแวดล้อม CI และโดยรวมพอใจกับความเสถียร ส่วน mypy ไม่ค่อยชอบเพราะแม้แต่งาน type ง่าย ๆ ก็ยังล้มเหลวบ่อย