สรุปสั้น ๆ
วันนี้แอดจะพามือใหม่หรือใครที่กำลังเขียน Python อยู่ มาทำความรู้จักกับคำสั่งหนึ่งในภาษา Python ที่จะช่วยให้การทำงานนั้นปลอดภัยมากขึ้น แต่ว่าจะเป็นคำสั่งยังไง แล้วทำให้โค้ดของเราปลอดภัยขึ้นยังไง มาดูไปพร้อมกันครับ
เขียนโดย
Sutthinai Boonyingyongchai
MidLevel Software Developer
บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 17 มกราคม 2566
ภาษา Python นั้นเขียนได้ง่ายแถมยังมี Library อีกจำนวนมหาศาลที่ครอบคลุมการใช้งานแทบทุกด้านเท่าที่เราจะนึกออก และเหมือนกับภาษาโปรแกรมมิ่งอื่น ๆ ที่มีบางคำสั่งต้องมีความระมัดระวังเวลาเรียกใช้งาน เพราะว่าเป็นการจอง Resource เอาไว้ อย่าง Memory หรือ Connection ตอนที่เราเขียนใช้งานคำสั่งเหล่านี้จึงต้องแน่ใจว่ามีการจัดการคืน Resorce เมื่อใช้งานเสร็จเสมอ
อย่างเช่นเวลาที่เราเปิดไฟล์หลังจากใช้งานเสร็จก็ต้องมีการปิดเพื่อคืน Resouce ด้วยทุกครั้ง ไม่ว่าจะเปิดสำเร็จหรือว่าเกิด Error ขึ้นก็ตาม โดยท่าปกติที่ใช้กันก็จะอยู่ในรูปแบบของ try-finally ซึ่งเราจะใส่ file.close() เอาไว้ใน finally แบบโค้ดด้านล่างนี้
file = open("path/to/file", "w")
try:
file.write("Hello borntoDev")
finally:
file.close()
โค้ดข้างบนสามารถทำงานได้อย่างสมบูรณ์แบบแล้ว แต่ว่าถ้าหากเราใช้ “with” โค้ดที่ทำงานได้เหมือนกัน
เป๊ะจะหดสั้นลงเหลือแค่นี้
with open("path/to/file", "w") as file:
file.write("Hello borntoDev")
แนะนำให้รู้จักกับ “with” Statement
เราได้เห็นแล้วว่าการใช้ with นั้นทำให้โค้ดสั้นลงได้ ทีนี้มาทำความรู้จักกันจริง ๆ ดีกว่าว่า with นั้นคืออะไร
“with” Statement ใน Python นั้นถูกสร้างขึ้นเพื่อใช้จัดการ การใช้ Resourse และจัดการกับ Error โดยเขียนในรูปแบบของการ “ห่อหุ้ม” โค้ดเหล่านั้นเอาไว้ข้างใน ได้เป็นโค้ดที่ออกมามีหน้าตาแบบนี้
with expression [as variable]:
with-block
ซึ่งแค่ “with” ตัวเดียวที่เราเขียนลงไปสั้น ๆ อันที่จริงแล้วมีการทำงานหลายขั้นตอนอยู่เบื่องหลังที่เรียกว่า Context Manager แต่ว่าไม่จำเป็นต้องลงลึกไปถึงการทำงานข้างหลังก็ได้ เราเรียกใช้สั้น ๆ แบบที่ทำอยู่ก็สะดวกและมีประโยชน์มาก ๆ แล้ว
เพิ่มเติมอีกนิดเรื่องที่มาของเจ้า with Statement ก็คือสิ่งนี้ถูกประกาศครั้งแรกตอน Python 2.5 และถูกปรับจากฟีเจอร์ทดลองใช้เข้ามาเป็นฟีเจอร์พื้นฐานของภาษา Python ในเวอร์ชัน 2.6 (Python 2.6) ซึ่งปัจจุบันตอนที่เขียนบทความนี้อยู่ก็เป็นเวอร์ชัน Python 3.11.1 แล้ว คิดว่า with Statement น่าจะมีอยู่ใน Python ที่ทุกคนกำลังใช้อยู่แน่นอน
ประโยชน์จากการใช้ with
เราสามารถใช้ประโยชน์จาก with ใน 2 เรื่องใหญ่ ๆ ก็คือ
1. จัดการ Resource ให้โดยอัตโนมัติ
# แบบปกติ
file = open("example.txt", "w")
file.write("Hello World!")
file.close()
# แบบที่ใช้ With
with open("example.txt", "w") as file:
file.write("Hello World!")
ในโค้ดตัวอย่างแบบแรกเราจะต้อง open แล้วก็ close เอง เพื่อให้การเรียกใช้ไฟล์นั้นถูกปิดลงอย่างถูกต้อง แต่ถ้าเราใช้ with จะเห็นว่าเราแค่เรียก open ก็พอ เพราะว่า with นั้นจะทำการ close ให้เองโดยอัตโนมัติ ไม่ต้องกลัวเปิดแล้วลืมปิดอีกต่อไป
หรือว่าจะเป็นการเขียนโค้ดจัดการ thread ก็สามารถใช้ with ได้เหมือนกันโดยช่วยลดคำสั่งที่ต้องจำลงได้
import threading
# แบบปกติ
lock = threading.Lock()
lock.acquire()
# บลาาาาา ๆ ๆ
lock.release()
# แบบที่ใช้ With
with threading.Lock():
# บลาาาาา ๆ ๆ
2. Error Handling ง่ายขึ้นกว่าเดิม
# แบบปกติ
try:
file = open("example.txt", "r")
data = file.read()
print(data)
except IOError:
print("File not found!")
finally:
file.close()
# แบบที่ใช้ With
try:
with open("example.txt", "r") as file:
data = file.read()
print(data)
except IOError:
print("File not found!")
สำหรับข้อนี้จะเป็นเรื่องของการ Handle Error ที่ได้ประโยชน์จากการใช้ with ร่วมกับการจัดการ Error เหมือนในโค้ดด้านบนที่เปิดไฟล์ที่แล้วต้องการ Handle IOError จึงครอบด้วย try-except แล้วก็มี finally ปิดท้ายเพื่อ close พอเรานำ with มาใช้ร่วมด้วยก็สามารถละการเขียน finally ออกไปได้เพราะว่า with จัดการ close ให้แล้วนั่นเอง ทำให้โค้ดดูซับซ้อนน้อยลง
หรือว่าจะเป็นการเขียนโค้ดจัดการ thread ก็สามารถใช้ with ได้เหมือนกันโดยช่วยลดคำสั่งที่ต้องจำลงได้
ตัวอย่างการใช้ with
การใช้งาน with นั้นขึ้นอยู่กับงานที่เราทำอยู่ ซึ่ง with สามารถช่วยให้เราเขียนโค้ดได้สะดวกขึ้นมาก ๆ ตั้งแต่การใช้กับ Library พื้นฐาน ไปจนถึง Library เครื่องมืออื่น ๆ ที่เราโหลดมาใช้งาน ดูจากตัวอย่างด้านล่างนี้ได้เลย
1. File
สำหรับตัวอย่างแรกน่าจะเห็นมาจากตัวอย่างก่อนหน้านี้แล้วก็คือการเปิดไฟล์โดยใช้ with ที่ช่วยจัดการเรื่องการปิดไฟล์ให้เรา
file = open("path/to/file", "w")
try:
file.write("Hello borntoDev")
finally:
file.close()
2. Thread
ตัวอย่างนี้ก็มีพูดถึงก่อนหน้าแล้วเช่นกัน กับการใช้งาน with เพื่อใช้งานคำสั่งเกี่ยวกับ Thread ที่เมื่อการทำงานภายใน with จบลงแล้วก็จะทำการ release โดยอัตโนมัติ
import threading
resource = "Shared Resource"
with threading.Lock():
print(f"Accessing {resource}")
resource += " modified by thread1"
print(f"{resource} modified by thread1")
print(f"Released {resource}")
3. Database Connection
ในกรณีที่เราต้องการเชื่อมต่อ Database เพื่อทำงานสั้น ๆ การที่เราใช้ with จะทำให้เราไม่ต้องเขียนโค้ดเพื่อปิดการเชื่อมต่อด้วยตัวเอง
from mysql.connector import connect, Error
try:
with connect(
host="localhost",
user="dbadmin",
password="supersecret",
database="borntodev",
) as connection:
print(connection)
except Error as e:
print(e)
4. Request
เครื่องมือที่หลาย ๆ คนน่าจะคุ้นตาอย่าง Library ที่ชื่อ Request ก็สามารถเขียนโดยใช้ with ได้เช่นกัน โดยที่เมื่อทำงานจบใน with ก็จะตัด connection ให้เราทันที
import requests
with requests.get("https://www.helloexampleweb.com") as response:
print(response.status_code)
print(response.text)
เพิ่มเติมเกี่ยวกับการใช้ with
ถึงตรงนี้ก็น่าจะพอเห็นภาพการนำ with ไปใช้งานกันมาบ้าง แต่ว่าก่อนจะจากกันไปขอฝากอีก 3 ไอเดียการใช้ with Statement ที่น่าจะทำให้รู้จักกับ with ได้มากขึ้น
1. ใช้หลายคำสั่งใน with เดียว
with open("file1.txt", "r") as file1, open("file2.txt", "r") as file2:
data1 = file1.read()
data2 = file2.read()
ในโค้ดจะเป็นการเปิดไฟล์หลายไฟล์ใน with เดียว เช่นเดียวกันกับการเปิดไฟล์เดี่ยว ๆ ด้วย with พอเราเอามาเปิดหลายไฟล์พร้อมกันก็ยังคงได้รับประโยชน์จาก with คือการันตีการปิดไฟล์ทุกไฟล์หลังทำงานเสร็จเหมือนเดิม
2. ใช้ with ใน with
with open("file.txt", "r") as file:
data = file.read()
with open("file2.txt", "w") as file2:
file2.write(data)
ภายใน with ที่เราสามาถใส่โค้ดนู่นนี่นั้นไว้ข้างในได้ แน่นอนว่าเราสามารถใส่ with ซ้อนเข้าไปก็ได้เช่นกัน
3. สร้าง Custom Context Manager ใช้เอง
class MyCustomContext:
def __enter__(self):
print("Enter")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exit")
def do_somthing(self):
print("Done")
with MyCustomContext() as resource:
resource.do_somthing()
อย่างที่เกริ่นไปตอนต้นว่า with นั้นเอาไว้ใช้กับ Context Manager ซึ่งถ้าหากเราอยากใช้ with กับคำสั่งหรือ Library บางอย่างที่ไม่รองรับ เราก็แค่เขียนขึ้นมาเองซะเลย ทำเป็น Class ที่เป็น Context Manager ครอบ Library เหล่านั้นเอาไว้อีกที
“อ่านจบแล้วหวังว่าทุกคนจะสนุกกับการใช้ with มากขึ้นนะครับ”
สุดท้ายยย หากใครใช้ Python ยังไม่คล่อง ยังไม่เป็นเรามีทางออก
กับหลักสูตร “Complete Python 3 Programming” สอนจัดเต็มเป็น 200 ตอนกับพื้นฐานภาษา Python ให้การเรียน Python เข้าใจจากพื้นฐานจริง ๆ สู่การต่อยอดแบบไม่รู้จบ หากใครสนใจสามารถเข้าไปดูได้ที่เว็บของเราได้เลยย ! จากปกติ 3,590.- เหลือเพียง 2,590.- เท่านั้น สนใจ คลิกที่นี่
ระบบฝึกทักษะ การเขียนโปรแกรม
ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง
- โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
- รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
- ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!