10 Python libraries ที่เราชอบในปี 2017

10 Python libraries ที่เราชอบในปี 2017

ช่วงท้ายปีเป็นช่วงที่คนส่วนใหญ่จะนั่งนึกถึงว่าเราทำอะไรมาบ้าง ตลอดปีที่ผ่านมา แล้วจะทำอะไรต่อไปในปีข้างหน้า ปกติแล้วทุกปีช่วงท้ายๆ ปีผมจะชอบรอ Tech Radar ออกซึ่งก็จะได้รู้จัก Tools และ Techniques ใหม่ๆ ที่ Proof แล้วว่า Work เลยคิดว่า คงจะดีไม่น้อยที่เราจะได้แบ่งปันอะไรบ้าง ในมุมมองของการทำงานที่ Pronto Tools นี้

1. pipenv 🗄

Source: https://docs.pipenv.org/

ปีนี้ถ้าจะไม่พูดถึง pipenv ก็คงจะไม่ได้ เพราะ library ตัวนี้ได้เปลี่ยน workflow ในการ develop python ไปอย่างสิ้นเชิง พร้อมกับความสามารถใหม่ๆ ที่เพิ่มเข้ามาจน Python.org ให้การรับรองว่าเป็น packaging tool ที่ควรจะใช้แทน pip ที่ใช้กันมาหลายปี

จุดเด่นหลักๆ ของ pipenv คือการเพิ่ม Pipfile มาแทนที่ requirements.txt ที่เป็น pattern พื้นฐานกันมาหลายปี ด้วย syntax แบบ TOML ที่ง่ายกว่ามาก และมีความสามารถมากกว่าเช่น สามารถกำหนด version ของ Python ที่ต้องการจะใช้ run ได้, สามารถกำหนด development package ได้ ทำให้เราไม่ต้องแยก file requirements.txt สำหรับแต่ละ environment อีกต่อไป นอกจากนั้นแล้ว pipenv ยัง เพิ่ม Pipfile.lock มาด้วย​ซึ่งทำให้เรามั่นใจได้ว่าจะได้ Package ที่ถูกต้องจริงๆ จาก PyPI

นอกจากจุดเด่นที่กล่าวมาข้างต้นแล้วใน version หลังๆ pipenv ยังได้เพิ่มความสามารถในการเช็ค security vulnerability ผ่านคำสั่ง pipenv check ซึ่งทำให้เรามั่นใจในความปลอดภัยของ Package ที่เราใช้มากยิ่งขึ้นไปอีก

2. Pendulum ⏳

Source: https://pendulum.eustace.io/

ที่พรอนโต้เราชอบ Arrow มากครับ หลังๆ แทบจะเอามาใช้แทน Datetime ตรงๆ เลย แต่ปีนี้มีเรา Pendulum ออกมา และมันน่าสนใจมาก

ข้อดีของ Pendulum เลยคือ ตัวมันเอง Inherit มาจาก DateTime class ของ Python เพราะฉะนั้นเราแทบจะแทนที่ datetime ด้วย Pendulum ได้ทั้งหมดเลย นอกจากนั้นแล้วตัว Pendulum ยังแก้ปัญหา edge case ต่างๆ ที่เจอใน Arrow ด้วย ทำให้เราไม่ลังเลเลยที่จะเปลี่ยนไปใช้มัน

3. Uplink 📡

Source: http://uplink.readthedocs.io/en/latest/

โปรเจ็คของเราเองหลายโปรเจ็คต้องต่อกับ Service API ข้างนอกครับ ซึ่งลำพังแค่ lib requests ที่เราใช้กันอย่างหนักหน่วงจะเริ่มมีความซับซ้อนขึ้น เพราะต้องยิงหลายๆ Endpoint ใน service เดียว วิธีที่เราแก้ปัญหาในเรื่องนี้คือเราสร้าง Class ขึ้นมาครอบ Service ที่เราจะใช้ แล้วเรียกการใช้งานผ่าน Class นั้นแทนโดยที่ข้างในสุดท้ายแล้วยังเป็น requests ที่ทำหน้าที่ในการยิง API อยู่

ปีนี้เราไปเจอ Uplink ซึ่งทำหลายๆ อย่างคล้ายกับ Design ที่เรากล่าวมาข้างต้นมาก แต่ใช้เป็น Decorator ในการ define endpoint แทน รวมถึงจัดการ header กับ timeout ได้ใน decorator เลย สะดวกมากๆ ครับ

4. MonkeyType 🙊

Source: https://github.com/Instagram/MonkeyType

ตั้งแต่ Python 3.6 เป็นต้นมา สิ่งหนึ่งที่เราตื่นเต้นมากคือการมี Type Annotation ให้ใช้ แต่เพราะ code base ที่เรามียังใหญ่อยู่มาก การใช้งาน Type Annotation ของเราเลยยังจำกัดอยู่เฉพาะส่วนที่มันสำคัญจริงๆ ของระบบไม่กี่ส่วน

เมื่อไม่กี่สัปดาห์ที่ผ่านมา Instagram ได้เปิดตัว MonkeyType ซึ่งเป็น Library ไว้ Generate type annotation จาก runtime ซึ่ง ก่อนหน้านี้ Dropbox ได้เปิดตัว PyAnnotate มาแล้วแต่ยังเป็น Python 2 style annotation เราเลยไม่สนใจมัน

เราค้นพบว่าการประยุกต์ใช้ MonkeyType กับ code base เราง่ายกว่าที่คิดมาก เนื่องจาก เรามี unit test คลุมทุกส่วนของระบบอยู่แล้ว แล้วเราใช้ pytest ในการ execute test การเอา MonkeyType มาใช้จึงแค่ให้มันอ่าน trace จาก Pytest runner แล้วให้ MonkeyType generate type annotation ออกมาหลังจากนั้น

5. Mimesis 🦑

Source: https://github.com/lk-geimfari/mimesis

เรามักจะมีปัญหาเสมอเวลาต้องคิดชื่อ หรือข้อมูลต่างๆ เช่น ที่อยู่ เบอร์โทร​ ฯลฯ ยิ่งระบบที่เก็บข้อมูลเยอะมากๆ อย่าง Pronto World แล้วยิ่งคิดยากมาก กว่าจะใส่ข้อมูลคนๆ นึงให้ครบได้ จนกระทั่งเรามาเจอ Mimesis

Mimesis เป็น Library ที่ช่วยจัดการ mock ข้อมูลต่างๆ ให้ ข้อดีคือเราไม่จำเป็นต้องมานั่งนึกข้อมูลเองว่าจะตั้งชื่ออะไร ใช้ที่อยู่อะไร เบอร์โทรศัพท์อะไร จริงๆ แล้วมีมากกว่านั้นอีก นอกจากนั้นแล้วยังมี translation หลายภาษามากๆ แต่ท้ายที่สุดแล้ว ประโยชน์สูงสุดที่ได้จาก Mimesis คือเราประหยัดเวลาในการคิดเรื่องที่ ไม่จำเป็นต้องคิดไปได้อีกหนึ่งเรื่องเลย

6. APIStar ✨🚀✨🌟

Source: https://github.com/encode/apistar

ที่พรอนโต้เราใช้ Django กันมานาน แล้วเราค่อนข้างจะเป็นแฟนพันธ์แท้กับ Django REST Framework ด้วย ซึ่งนั่นทำให้เราตื่นเต้นมากเมื่อ Tom Christie สร้าง Framework สำหรับทำ Web API ตัวใหม่ขึ้นมา

จุดเด่นหลักๆ เลยคือ API Star ใช้ประโยชน์ของ Type Annotation ใน Python 3.6 ได้อย่างมีประสิทธิภาพมาก ถ้าเราชิน Request / Response Cycle ของ Django แล้วตัวนี้จะเปลี่ยนวิธีคิดเราไปเลย เพราะมองว่า API หนึ่ง Endpoint คือ function เดี่ยวๆ ที่รับ Argument แล้ว Return Value ออกไป นอกจากนั้นแล้วยังมี API Documentation ในตัวเอง generate มาจาก code ที่เป็น view ทำให้เรามั่นใจได้ว่า เราจะไม่ตกหล่นการเขียน Document ของ view ไหนออกไป

7. Box 📦

Source: https://github.com/cdgriffith/Box

Box เป็น Library เล็กๆ ที่ไม่มีอะไรซับซ้อนเลย มันแค่แปลง Dictionary ใน Python ให้สามารถใช้ dot notation ในการเข้าถึงข้อมูลได้ บางคนอาจจะสงสัยว่า แล้วทำไมไม่ใช้ Nametuple หรือประกาศ Class ไปเลย ใช่ครับมันทำได้ แต่จะทำให้มันซับซ้อนขนาดนั้นทำไม ตัว Box เองเนี่ยพอใช้งานจริง แล้วมันเบามากๆ แทบจะโยน Dict ทั้งก้อนแล้ว Access จาก Object ของ Box แทนเลย เบาแถมโค้ดสะอาดขึ้นไม่ต้องมี quote กับ bracket มากวนใจ

8. Python-Fire 🔥

Source: https://github.com/google/python-fire

เคยเขียน Script Python แล้วอยากทำให้มันทำอะไร ได้เยอะๆ เหมือนโปรแกรมใน cli ของ Linux เช่น curl บ้างมั้ยครับ กว่าจะทำได้ สมัยก่อนเราต้องใช้ argparse ซึ่งเป็น standard library ที่อยู่คู่ Python มายาวนาน มา define ว่าจะรับค่าอะไร ผ่าน arguments หน้าตาเป็นยังไง

Fire เนี่ยง่ายๆ เลยครับ แค่เขียน function หรือ class หรือ Python object อะไรก็ได้ แล้วครอบมันด้วย Fire object มันจะทำการแปลง arguments, Method ฯลฯ อะไรก็ตามที่มัน call ได้ให้เป็น Option ใน CLI แค่นั้น จบครับ โคตรง่าย จนผมยังตกใจเลยว่านี่มันเสร็จแล้วเหรอ

9. Magic Wormhole 🌪

Source: https://github.com/warner/magic-wormhole

อันนี้อาจจะไม่ใช่ Library ที่สร้างในปีนี้ แต่ผมเพิ่งมาค้นพบในปีนี้ ในสมัยโบราณกาลเราใช้ scp ในการ copy ไฟล์ระหว่างเครื่อง ถัดมาเราก็รู้จัก rsync ที่ทำให้ชีวิตมันง่ายขึ้นไปอีก แต่มันยังง่ายไปกว่านั้นได้อีกครับด้วย Magic Wormhole

Magic Wormhole ทำให้การส่งไฟล์ข้ามกันระหว่างสองเครื่อง เป็นเรื่องง่ายโคตรๆ โดยฟังส่งก็แค่พิมพ์ wormhole send <file> พอพิมพ์เสร็จจะได้โค้ดมาซึ่งโค้ดที่ว่าเนี่ย สามารถอ่านออกเสียงได้ เหมาะกับการพูดบอกโค้ดกันเช่น 7-crossover-clockwork ทีนี้ฝั่งรับก็แค่มี wormhole ลงอยู่แล้วพิมพ์ wormhole receive หลังจากนั้นมันจะถามโค้ดจากฝั่งส่งก็พิมพ์ไป แค่นี้ก็ได้ ง่ายมากไม่ต้องจำ IP / host อะไรเลย

10. PrettyPrinter 🖨

Source: https://prettyprinter.readthedocs.io/en/latest/

สุดท้ายเป็น Library เล็กๆ อีกแล้ว เพิ่งออกมาได้ยังไม่ถึงเดือนเลย แต่ก็เอามาใช้แล้ว แล้วเราชอบมาก คือ PrettyPrinter พอพูดแบบนี้แล้วก็จะเกิดคำถามอีกว่า ทำไมไม่ใช้ pprint ที่มีอยู่แล้ว

เหตุผลหลักๆ เลยคือ pprint ไม่รู้จัก Django ครับ เราเลยใช้ความสามารถของ PrettyPrinter เต็มที่มากๆ เวลา debug ไม่ต้องมานั่ง กดดู Model Instance แต่ละตัวว่ามีค่าอะไรบ้าง พอใช้ตัวนี้แล้ว มันกระจายให้ละเอียดและ Indent ให้แบบสวยงามพร้อมสีสันสดใสเลยครับ

แน่นอนว่าตลอดหนึ่งปีที่ผ่านมา Library ที่เกิดขึ้นใหม่ใน Python Community มันไม่ได้มีแค่นี้หรอกครับ และยังมีอีกหลายตัวที่ผมอยากพูดถึง แต่อาจจะยาวเกินไปสำหรับ Story นี้ผมเลยจะ List Packages ที่ผมเจอและชอบที่เหลือไว้ตรงนี้แทน
* asyncssh (https://github.com/ronf/asyncssh)
* requestium (https://github.com/tryolabs/requestium)
* Ray (https://github.com/ray-project/ray)
* newspaper (https://github.com/codelucas/newspaper)


Original post at: https://yothinix.medium.com/10-python-libraries-ที่เราชอบในปี-2017-143c06a70619