แนวปฏิบัติสมัยใหม่ที่ดีสำหรับ Python ของ Stuart Ellis
(stuartellis.name)Modern Good Practices for Python Development
แนวปฏิบัติสมัยใหม่ที่ดีสำหรับ Python ของ Stuart Ellis กล่าวถึงประเด็นสำคัญที่ควรพิจารณาเมื่อพัฒนา Python โดยมีสาระสำคัญดังนี้:
การใช้งาน Python
- หลีกเลี่ยงการใช้ Python ที่มากับระบบปฏิบัติการ: Python ที่ติดมากับระบบปฏิบัติการอาจเป็นเวอร์ชันเก่า
- ติดตั้ง Python ด้วยเครื่องมือที่รองรับหลายเวอร์ชัน: ใช้เครื่องมืออย่าง pyenv หรือ mise
- ใช้ Python เวอร์ชันล่าสุด: ใช้เวอร์ชันเสถียรล่าสุดเพื่อรับแพตช์ความปลอดภัยและการปรับปรุงประสิทธิภาพ
- ใช้ pipx สำหรับรันแอปพลิเคชันของนักพัฒนา: รันแอปในสภาพแวดล้อมแบบแยกด้วย pipx
- ใช้เครื่องมือสำหรับโปรเจ็กต์: แนะนำ PDM, Hatch, Mise, Rye
การพัฒนาโปรเจ็กต์ Python
- จัดรูปแบบโค้ด: ใช้ Ruff
- ลินต์โค้ด: แนะนำ Ruff
- ทดสอบด้วย pytest: ใช้ปลั๊กอินที่เกี่ยวข้อง (pytest-randomly, pytest-cov)
- การแพ็กเกจ: ใช้แพ็กเกจ wheel และหากจำเป็นให้ใช้อิมเมจคอนเทนเนอร์หรือ PyInstaller
ไวยากรณ์ของภาษา
- ใช้ type hinting: PEP 484, PEP 526
- จัดรูปแบบสตริงด้วย f-string: PEP 498
- ใช้อ็อบเจ็กต์ datetime ที่รับรู้เขตเวลา: PEP 615
การออกแบบแอปพลิเคชัน
- ใช้ logging แทน print()
- ใช้รูปแบบ TOML สำหรับการตั้งค่า: PEP 680
- ใช้ asynchronous I/O เฉพาะเมื่อจำเป็นเท่านั้น
ไลบรารี
- จัดการอินพุตบรรทัดคำสั่งด้วย argparse
- จัดการพาธไฟล์และไดเรกทอรีด้วย pathlib
- ใช้ os.scandir() ที่เร็วและมีประสิทธิภาพแทน os.listdir(): PEP 471
- ใช้ subprocess เมื่อต้องรันคำสั่งภายนอก: PEP 324
- ใช้ httpx แทน requests สำหรับเว็บไคลเอนต์
แนวปฏิบัติที่ดีสำหรับโปรเจ็กต์
- ใช้ไฟล์
pyproject.toml: PEP 517, PEP 518, PEP 621, PEP 660 - ใช้ src layout: เปรียบเทียบ src layout กับ flat layout
- ใช้ virtual environment สำหรับการพัฒนา: แนะนำ venv, PDM, Hatch, Mise
- ใช้ไฟล์ requirements สำหรับการติดตั้งแพ็กเกจ: ใช้ pip-compile ผ่าน pip-tools หรือใช้ uv
ดูรายละเอียดเพิ่มเติมได้ในบทความฉบับเต็ม
.
.
สรุปการสนทนาใน Hacker News เกี่ยวกับ Python Modern Practices
การสนทนาใน Hacker News เกี่ยวกับ Python Modern Practices มีการแชร์ความคิดเห็นของผู้ใช้เกี่ยวกับเครื่องมือและแนวทางต่าง ๆ ดังนี้:
- แนะนำให้ใช้ UV: การใช้ UV นั้นเร็ว ใช้งานง่าย และยังมีการซัพพอร์ตที่ดีเมื่อเกิดปัญหา by screye
- กล่าวถึง Rye: Rye รองรับการ pin และดาวน์โหลด Python interpreter และมีแผนจะรวมเข้ากับ uv by rat87
- เน้นความเรียบง่ายของเครื่องมือปัจจุบัน: ใช้ Mamba environment กับ pip พื้นฐานก็ไม่มีปัญหา และไม่รู้สึกว่าจำเป็นต้องเปลี่ยนเครื่องมือ by helsinki
- ชอบเครื่องมือพื้นฐาน: ใช้ pip, venv, virtualenvwrapper ก็สามารถแก้ปัญหาส่วนใหญ่ได้ by throwadobe
- ปกป้องการใช้ Pipenv: ใช้ Pipenv มาในฐานะโซลูชันแบบครบวงจร และไม่เข้าใจว่าทำไมถึงไม่ถูกใช้อย่างแพร่หลายมากกว่านี้ by routerl
- ปัญหาของ Poetry: รู้สึกผิดหวังกับ Poetry จากปัญหาอย่างการไม่สามารถเพิ่มตัวระบุเวอร์ชันจาก Git commit ได้ by alisonatwork
- Conda และ Mamba: Conda มีความสามารถในการจัดการ dependency ที่ทรงพลังกว่ามาก และ Mamba ก็เร็วกว่า by wanderingmind
- ปัญหาด้าน Packaging: ปัญหาการแพ็กเกจของ Python มีสาเหตุเชิงสังคมอยู่มาก และน่าจะเป็นปัญหาต่อไปเสมอ by jampekka
- ข้อเสนอทางเลือกแทน Pyenv: Mise เร็วกว่า Pyenv และยังรองรับโปรเจ็กต์ Node ด้วย by odie5533
- Pydantic model และ data class: Pydantic model มีความสามารถด้านการตรวจสอบข้อมูลที่แข็งแกร่งแต่ช้า ขณะที่ data class เบาและมีประสิทธิภาพกว่า by martinky24
ดูรายละเอียดเพิ่มเติมได้ที่การสนทนาใน Hacker News
5 ความคิดเห็น
ไม่มีเนื้อหาเกี่ยวกับการทำให้ไลบรารีมีขนาดเบาลงเลย
การใช้ virtual env ของ miniconda3 และลบ lib ที่ไม่ได้ใช้ออกเพื่อให้ deploy ได้แบบ portable ช่วยรับประกันประสิทธิภาพที่ดีกว่าในระบบประมวลผลแบบกระจายอย่าง yarn.
ทำไมถึงควรใช้ pip-tools หรือ uv ล่ะ? ไม่มีหลักฐานรองรับคำกล่าวเลยว่ามันทันสมัยหรือดีกว่า
ดูเหมือนว่าจะมี ปัญหาในพฤติกรรมปัจจุบันของ pip ที่ไม่สามารถระบุ build version ได้ ซึ่งเป็นเหตุผลว่าทำไมจึงต้องใส่แฮชไว้ในตัวระบุ dependency ของ pip อยู่เหมือนกันนะครับ ถ้าไม่มีบริบทแบบนี้ คู่มือที่แค่ไล่เรียงแนวทางปฏิบัติก็ดูไม่น่าโน้มน้าวใจเท่าไร
ปกติคุณใช้ตัวไหนเป็นหลักครับ??
ก่อนหน้านี้ผมทำงานโดยใช้แค่
pip freezeมาตลอด โดยคัดเลือกเฉพาะไลบรารีที่รองรับ Windows/Linux มาใช้งาน และจนถึงตอนนี้ก็ยังไม่เคยมีปัญหาที่เกิดจากการเปลี่ยนเวอร์ชันแพตช์ ถึงอย่างนั้น ตอนนี้เมื่อรู้ถึงปัญหาแล้วก็เข้าใจถึงความจำเป็นอยู่ เพียงแต่ตั้งใจว่าจะพิจารณาใช้pip-toolsหรือuvเมื่อมันมีความสมบูรณ์มากขึ้นอีกหน่อย