Skip to main content

สรุปสั้น ๆ

วันนี้แอดจะพามือใหม่หรือใครที่กำลังเขียน 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 ยังไม่คล่อง ยังไม่เป็นเรามีทางออก

คอร์สเรียนที่ได้รับความนิยมสูงสุดของ borntoDev

กับหลักสูตร “Complete Python 3 Programming” สอนจัดเต็มเป็น 200 ตอนกับพื้นฐานภาษา Python ให้การเรียน Python เข้าใจจากพื้นฐานจริง ๆ สู่การต่อยอดแบบไม่รู้จบ หากใครสนใจสามารถเข้าไปดูได้ที่เว็บของเราได้เลยย ! จากปกติ 3,590.- เหลือเพียง 2,590.- เท่านั้น สนใจ คลิกที่นี่

ระบบฝึกทักษะ การเขียนโปรแกรม

ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง

  • โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
  • รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
  • ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!
เข้าใช้งานระบบ DevLab ฟรี !เรียนรู้เพิ่มเติม

เรียนรู้ไอที “อัพสกิลเขียนโปรแกรม” จากตัวจริง
ปั้นให้คุณเป็น คนสายไอทีระดับมืออาชีพ

BorntoDev

Author BorntoDev

BorntoDev Co., Ltd.

More posts by BorntoDev

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

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

บันทึกการตั้งค่า