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

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

เป็นธรรมเนียมที่พึ่งสร้างเป็นปีที่สองกันครับว่า เราจะมามองย้อนกลับไปในปี 2018 ที่กำลังจะผ่านพ้นไปว่า Python Libraries ตัวไหนที่เราชอบบ้าง ของปีที่แล้วเราคัดมา 10 Libraries ปีนี้เราก็จะคัดมาอีก 10 เหมือนกันครับ แต่ลำดับไม่มีผลอะไรนะครับ ไปดูกันเลย

Source: https://github.com/ambv/black

1. Black — The uncompromising code formatter

Source: https://github.com/ambv/black

ในสมัยก่อนพอพูดถึง Formatter ของ Python เราจะนึกถึงแค่ yapf เป็นหลัก รองลงมาก็ autopep8 ซึ่งก็มีฐานผู้ใช้ระดับนึง ปีนี้เรามีเจ้าใหม่เข้ามาในตลาดครับ ซึ่งก็คือ Black นี่เอง

จุดเด่นของ Black คือ just work ครับลงปั๊ปใช้ได้เลย หรือถ้าอยากจะ config ก็ได้นิดหน่อย อีกจุดเด่นที่ทุกคนที่ได้ลองใช้ Black พูดถึงและมีทั้งชอบและไม่ชอบคือใช้ double quotes (“) มากกว่า single quotes (‘) ครับ แต่หลายๆ คนพอใช้แล้วก็ยังพิมพ์ single quotes เหมือนเดิมรวมทั้งผมด้วย แล้วปล่อยให้ Black มันจัดการไปครับ นอกจากนั้นแล้วตัว Black ยัง Optimize ให้ใช้กับ syntax ใหม่ๆ ที่มีใน Python 3.6+ และ stub file สำหรับเขียน type signature ของ function ด้วยครับ

ในปีที่ผ่านมาหลายๆ OSS โปรเจ็คได้ adopt Black เป็น codestyle (ล่าสุดก็ Hypothesis ครับ) สำหรับใครที่ลังเลอยู่ Black ก็มี playground ให้ลองเล่นนะครับ เผื่อจะช่วยให้ตัดสินใจง่ายขึ้น

Source: https://github.com/tonybaloney/wily

2. Wily — A command-line application for tracking, reporting on complexity of Python tests and applications

Source: https://github.com/tonybaloney/wily

Code complexity เป็นเรื่องหนึ่งที่ถูกหยิบขึ้นมาคุยใน Code Review บ่อยครับ แต่หลายๆ ครั้งเราไม่ค่อยมี proof เท่าไร และมักจะเป็นความรู้สึกมากกว่า Wily จะเข้ามาช่วยเราแก้ปัญหาในเรื่องนี้ครับ

Wily เป็น Library ที่ช่วยเราอ่าน Complexity ของ Code แล้วสร้าง report ให้เราครับ ความเจ๋งคือมันสร้าง report ได้เยอะมากตั้งแต่ command line output ยัน html graph เลยครับ โดย Metric ที่ Wily ดูมีตั้งแต่ Line of code, Cyclomatic complexity ไปจนถึง Maintainability index เลยครับ

ก่อนหน้านี้มี Library ที่วัด Metric code อยู่ครับคือ Radon กับ pylama แต่ปฏิเสธไม่ได้จริงๆ ว่า report กับ Statistic feature ของ Wily นี่มัน Game changer จริงๆ

source: https://github.com/benfred/py-spy

3. py-spy — A sampling profiler for Python program

Source: https://github.com/benfred/py-spy

ปัญหา Optimization เป็นปัญหานึงที่เราชาว Developer ต้องเจอกันเป็นประจำใช่มั้ยครับ แต่ก่อนเราจะ Optimize อะไรซักอย่างเราต้อง Measure มันให้ได้ก่อน ซึ่งวิธีการ Measure ก็มีหลายแบบโดยอาจจะไปแปะๆ log time เอาไว้ แต่ถ้ามันช้าใน Production หละการจะไปแปะๆ log time เอาไว้มันก็ทำไม่ได้เลยใช่มั้ยครับ นั่นแหละครับคือสิ่งที่ py-spy มาแก้ให้เรา

py-spy ก็เป็น Profiler อีกตัวนึงครับ ความเจ๋งของมันก็คือ เราไม่ต้องแก้ code อะไรเลยเราสามารถจะ profiling ตัว Python process ที่กำลังรันอยู่หรือจะรัน script ผ่าน py-spy ก็ได้ครับ ซึ่งตัว py-spy จะ provide interface คล้ายๆ กับ top ที่เราคุ้นเคยกันเพื่อแสดงว่า function/method ไหนที่กินเวลาเรามากที่สุดครับ

Source: https://itsdangerous.palletsprojects.com/en/1.1.x/

4. itsdangerous — Various helpers to pass trusted data to untrusted environments and back.

Source: https://github.com/pallets/itsdangerous

โลกนี้อยู่ยากครับ ยิ่งต้องส่งข้อมูลไปมาผ่าน network ยิ่งต้องสันนิษฐานว่ามีโอกาสที่จะมีคนมาเปิดข้อมูล เลยทำให้เราต้องหาวิธีที่จะป้องกันไม่ให้คนเปิดข้อมูลสำคัญๆ นั้นได้ซึ่งส่วนใหญ่ก็เข้ารหัสกัน แต่จะทำยังไงก่อนหน้านี้ถ้าต้องทำอะไรแนวๆ นี้เราก็จะ implement เองซะส่วนใหญ่ครับจาก tools ที่ standard library มีให้เอามาประกอบๆ กัน แต่ตอนนี้เรามีคนทำให้แล้วครับ

itsdangerous เป็น set ของ utils ที่ช่วยเราเข้า/ถอดรหัสข้อมูลที่ sensitive ครับโดยใช้ HMAC / SHA-512 เป็นตัว sign message ของเรา ตัว library ได้แรงบันดาลใจมาจาก Django’s signing module เพราะฉะนั้น API เลยค่อนข้างจะคล้ายๆ กันมากครับ นอกจากนั้นแล้วยังรองรับมาตรฐาน JSON Web Signature ด้วยครับ

Source: https://github.com/sdispater/poetry

5. Poetry — Dependency Management for Python

Source: https://github.com/sdispater/poetry

ปีนี้ถ้าจะไม่พูดถึง Poetry ก็เหมือนจะขาดอะไรไป อย่างหลังจากปีที่แล้ว pipenv ได้ครองตลาดไปและ PyPI แนะนำว่าเป็น Package management ที่ควรใช้ แต่สำหรับคนที่ใช้ pipenv มาซักระยะจะเจอปัญหาที่สำคัญอย่างนึงคือ มันช้าครับ ตอนสร้าง Lockfile ค่อนข้างจะช้ามาก แต่นอกจากปัญหาฝั่ง user แล้วในส่วนของ pipenv เองนั้นก็ค่อนข้างจะซับซ้อนขึ้นเรื่อยๆ จน scale ยากครับ ผู้ท้าชิงตำแหน่งนี้ของปีนี้คือ Poetry ครับ

Poetry เห็นข้อเสียหลายๆ อย่างของ pipenv และนำเสนอแนวทางใหม่ในการจัดการ dependencies ครับ โดย Poetry เลือกที่จะใช้ pyproject.toml ตามมาตรฐาน PEP 518 เป็นไฟล์หลักและมี poetry.lock เพิ่มขึ้นมาครับ ตัว Interface CLI นอกจาก add / install / update / remove มาตรฐานแล้ว ก็ยัง provide interface สำหรับจัดการ package ขึ้น PyPI ด้วยครับ build หรือ publish หรือสร้าง virtualenv ให้สำหรับ local environment ก็มีครับและที่สำคัญที่สุด generate lock ไฟล์เร็วมาก

ถ้าใครใช้ pipenv แล้วรู้สึกเหนื่อยๆ อืดๆ ลองเปลี่ยนมาใช้ poetry ดูครับโลกจะเปลี่ยนไปมากเลย

Source: https://github.com/kennethreitz/responder

6. Responder — a familiar HTTP Service Framework for Python

Source: https://python-responder.org/en/latest/

หลังจากปีที่แล้ว Kenneth Reitz ได้ทำให้โลกรู้จักกับ pipenv ไปแล้ว ปีนี้เค้ากลับมากับ responder ครับ (และ Bruce ที่ค่อยๆ เงียบหายไป)

ตัว Responder ดึงจุดเด่นจาก Framework อื่นมาเช่น Route แบบ Flask, Mutate Request/Response cycle แบบ Falcon, รองรับ WSGI interface และ ASGI interface ผ่าน Starlette, รองรับ graphQL ผ่าน graphene, รองรับ OpenAPI Schema ฯลฯ เรียกได้ว่า Interface สมัยใหม่ของ webservice แทบจะรองรับหมดแล้วครับสำหรับ Framework ตัวนี้

7. Cursive_re — Readable regular expressions for Python 3.6 and up.

Source: https://github.com/Bogdanp/cursive_re

เขียน Regular Expression เป็นเรื่องยากครับ จะเขียนทีก็ต้องมาเปิด Document ทีว่าเขียนยังไง บางทีขี้เกียจเขียนก็ search หาเอาก็มี ปีนี้ผมผ่านไปเจอ cursive_re ครับและจะทำให้ชีวิตการเขียน Regular expression ของเราง่ายขึ้น

ตัว cursive_re จะแทนที่ Regular Expression syntax เราด้วย set ของ utils function ที่เราสามารถจะ compose ออกมาเป็น regular expression ได้ครับ ก็ช่วยให้เขียน pattern matching ง่ายขึ้นนิดหน่อย

Source: https://github.com/Delgan/loguru

8. Loguru — Python logging made (stupidly) simple

Source: https://github.com/Delgan/loguru

หลายๆ ครั้งใน Program เราต้องมีการใส่ log ไว้ใช่มั้ยครับ จุดประสงค์หลักคือเพื่อให้การ debug หรือ monitor ภายหลังสะดวกขึ้น ซึ่งตัว Python เองก็มี Standard library — Logging ไว้ให้อยู่แล้ว แต่โดยตัวมันเองถ้าไม่ config อะไรเลยก็ทำงานไม่ค่อยต่างจาก print() ฟังก์ชั่นเท่าไร

ตัว Loguru เป็น utils เล็กๆ ที่ provide interface ที่เราจะพ่น Log ไว้ให้ผ่าน logger function ที่เราเอาไปแปะไว้ใน function / class method ที่ต้องการครับ โดยตัว loguru จะสร้าง default format มาให้ out of the box เลยซึ่งจะเพิ่ม วันเวลา และ function ที่ execute ออกมาให้ด้วยนอกจาก message ครับ แต่ที่ซื้อผมได้มากที่สุดนี่คือมันมีสีนี่แหละทำให้ log มันน่าอ่านขึ้นมากครับ นอกจากนั้นแล้วตัว exception มันยังสามารถเปิดให้ catch value ของ variable ไว้ได้ด้วยครับ มีประโยชน์มากในการ debug ต่อไป

Source: https://pyre-check.org/

9. Pyre — A performant type-checker for Python 3

Source: https://pyre-check.org/

โลกของ Typing ใน Python ก็ยังมีพัฒนาการเรื่อยๆ ครับ ปีที่แล้วเราเจอ MonkeyType จาก Instagram ที่ช่วย generate type signature ให้เราโดยที่เราไม่ต้องไปไล่เขียนทุกไฟล์เอง ในปีนี้เรามี Pyre จาก Facebook (ซึ่งน่าจะมาจากทีมเดียวกัน) และมันน่าสนใจมากเลยทีเดียว

Pyre เป็น Type checker เช่นเดียวกับ mypy ครับ ซึ่งทางทีมโฆษณาไว้ว่าเร็วกว่า mypy มากๆ เพราะมันจะเช็คแค่ dependencies ที่เกี่ยวกับโค้ดที่แก้ นอกจากนั้นแล้วยังรองรับ Watchman ซึ่งเป็น file watcher ที่ Facebook พัฒนาขึ้นทำให้เราแทบจะ automate การรัน type checker ได้เลย

10. Responses — A utility for mocking out the Python Requests library

Source: https://github.com/getsentry/responses

Responses อาจจะไม่ใช้ Library ที่เกิดในปีนี้ แต่เป็น Library ที่เราค้นพบในปีนี้ที่เปลี่ยนวิธีการเขียนเทสของทีมไปเลย ซึ่งก่อนหน้านี้เราก็เคยเขียนบล็อกอธิบายความดีงามของมันไปแล้ว แต่ถ้าใครยังไม่เคยอ่านก็ตามไปที่ลิ้งข้างล่างเลยครับ

Mock requests แบบสวยๆ ด้วย responses
สิ่งหนึ่งที่เราเจอไม่ว่าจะช้าหรือเร็วคือ เมื่อเขียน Python ไปซักพักเราต้องยุ่งกับการยิง HTTP request ไปหา service ข้างนอก ซึ่ง Library ที่นิยมที่สุดในการทำสิ่งนี้ใน Python ก็คงหนีไม่พ้น requests นะครับ สมมติเรามีฟังก์

Worth mentioning

ยังมี Package อีกหลายตัวครับที่เราชอบ แต่เราจะไม่ลงรายละเอียดมากก็จะขอ List ไว้ตรงนี้ละกันครับ

  • ปีที่ผ่านมานอกจาก Responder แล้วยังมี API Framework เกิดขึ้นมาอีกหลายตัวครับ ที่อาศัย async ในการเพิ่มความเร็ว service ซึ่งมีสองสามตัวที่น่าสนใจมากที่เกิดขึ้นในปีนี้คือ molten กับ Vibora ครับ และที่ไม่พูดถึงไม่ได้เลยคือ Starlette ครับ
  • จะเห็นว่า Trend package ที่ชอบปีนี้ส่วนใหญ่มาในแนว utils เล็กๆ ซึ่งช่วยให้งานใหญ่ๆ เราทำงานง่ายขึ้น มีอีกหลายตัวที่ผมคัดมาแต่ไม่ได้พูดถึงเพราะซ้ำแนวกัน อย่างเช่น Logme ที่เอาไว้ใช้แทน logger แต่ก็แพ้ความสามารถของ Loguru ไป เป็นต้น
  • Pampy — เป็น Library ไว้ทำ Pattern matching อันนี้เพิ่งออกมาได้ไม่กี่นาน แต่ดูดีเลยทีเดียว มีเก็บไว้ในคลังเอาไว้แก้โจทย์ algorithm ได้

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