คำสั่ง "with as" ของ Python ใน Julia, JavaScript, Lua และภาษาอื่นๆ

หนึ่งในความท้าทายสำหรับฉันที่จะเข้าใจwith asคุณลักษณะใน Python ความต้องการนั้นไม่ชัดเจน เว้นแต่คุณจะเข้าใจข้อจำกัดของภาษา Python อย่างลึกซึ้งยิ่งขึ้น

ตัวอย่างเช่น นักพัฒนา Ruby, Julia, Lua, Go, JavaScript หรือ Swift ไม่จำเป็นต้องเพิ่มคำสั่งนี้ ทำไมถึงเป็นอย่างนั้น?

หัวใจของปัญหาคือคุณลักษณะที่นักพัฒนา Python หลายคนชื่นชอบ: การใช้การเยื้องเพื่อระบุบล็อคโค้ด

ใน JavaScript ฉันสามารถเขียนได้เช่น

openfile('foobar.txt', function(file) {
  // called after file has been opened
  // file is a handle to the open file
  read_data(file)
  ...
});

openfile("foobar.txt", function(file)
  -- called after file has been opened
  -- file is a handle to the open file
  read_data(file)
  ...
end)

openfile("foobar.txt", def (file):
  # called after file has been opened
  # file is a handle to the open file
  read_data(file)
  ...

มันแสดงให้เห็นถึงประโยชน์ของการมีสัญลักษณ์เพื่อส่งสัญญาณการสิ้นสุดของบล็อกของรหัสมากกว่าการเปลี่ยนแปลงในการเยื้อง

การใช้ฟังก์ชันการสั่งซื้อที่สูงขึ้นพร้อมการปิดสำหรับการจัดสรรทรัพยากรและการล้างข้อมูล

ให้เราเข้าไปดูรายละเอียดประโยชน์ของการมีไวยากรณ์ที่เป็นมิตรสำหรับการปิดหลายบรรทัดแบบอินไลน์ ฉันจะอธิบายด้วยตัวอย่างโค้ด Julia แม้ว่า JavaScript, Lua และภาษาอื่น ๆ อีกมากมายจะทำงานได้ดีเช่นกัน

function openfile(callback, filename::String)
		file = open(filename)
    callback(file)
    close(file)
end

openfile(file -> print(readline(file)), "foobar.txt")

openfile("foobar.txt") do file
		print(readline(file))
end

ความงามของวิธีการเปิดและปิดไฟล์นี้คือ คุณจะไม่ลืมปิดไฟล์

โซลูชัน Python

ตามที่อธิบายไว้มันยากที่จะบรรลุสิ่งเดียวกันใน Python ไวยากรณ์ของมัน จึงwith-asได้คิดค้น ให้ฉันแสดงให้เห็นว่าตัวอย่างก่อนหน้านี้จะถูกนำไปใช้ใน Python อย่างไร

class openfile:
   def __init_(self, filename):
       self.filename
   def __enter__(self):
       self.file =  open(self.filename)
       return file
   def __exit__(self, exc_type, exc_val, exc_tb):
       close(self.file)

เราสามารถใช้คลาสนี้เพื่อเปิดและอ่านจากไฟล์ในลักษณะนี้:

with openfile("foobar.txt") as file:
  print(readline(file))

  1. อันดับแรก ตัวสร้างของopenfileคลาสจะถูกเรียก และเราเก็บชื่อไฟล์ที่เราต้องการเปิด
  2. อินสแตนซ์ของopenfileคลาสถูกส่งไปยังwith-asโครงสร้าง ซึ่งทำให้__enter__เมธอดของมันถูกเรียก มันควรจะได้รับทรัพยากรที่ต้องการของเรา ตัวจัดการไฟล์ในกรณีนี้
  3. วัตถุที่ส่งคืนจะกลายเป็นอาร์กิวเมนต์asของ อ้างas fileถึงวัตถุที่ส่งคืนจาก__enter__. ชื่อไม่ต้องตรงกัน เราสามารถเขียนas foobarแทนได้
  4. เมื่อโค้ดทั้งหมดภายในwith-asบล็อกถูกรันแล้ว Python จะเรียกใช้__exit__เพื่อปล่อยทรัพยากร สิ่งนี้จะถูกเรียกในกรณีที่มีข้อยกเว้นเกิดขึ้น

มีรูปแบบมากมายในการสร้าง คลาส ตัวจัดการบริบท เหล่านี้ โดยการจัดคลาสย่อยหรือการใช้มัณฑนากร

Suggested posts

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

ตัดตอนมาจาก Small, Sharp Software Tools โดย Brian P. Hogan

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

เมื่อคุณส่งคำขอไปที่ facebook.com คอมพิวเตอร์ของคุณจะค้นหาชื่อโดเมนเพื่อแปลชื่อโดเมนนั้นเป็นที่อยู่ IP เพื่อให้คอมพิวเตอร์ของคุณสามารถเชื่อมต่อได้

D-word และ L-word ในการออกแบบ UI เรื่องภาษา อย่าเหยียดเชื้อชาติ

D-word และ L-word ในการออกแบบ UI เรื่องภาษา อย่าเหยียดเชื้อชาติ

ภาษาของเราเป็นเครื่องมืออันทรงพลังที่สามารถกำหนดความคิด ทัศนคติ และการกระทำของเรา แม้แต่คำที่ดูเหมือนไม่เป็นอันตรายก็สามารถขยายเวลาอคติและแบบแผนที่เป็นอันตรายได้

Related posts

อะไรทำให้พอดคาสต์มีอิทธิพล?

อะไรทำให้พอดคาสต์มีอิทธิพล?

เมื่อสัปดาห์ที่แล้วฉันสังเกตเห็นข่าวประชาสัมพันธ์ที่เผยแพร่ผ่าน PressGazette (เว็บไซต์ข่าวของสื่ออังกฤษ) บทความประกาศว่า Acast ซึ่งเป็นบริษัทโฮสติ้งและโฆษณาพอดคาสต์ของ Scandi จะเป็นผู้นำกลุ่มผู้เผยแพร่ "อาจมีอิทธิพลมากที่สุด" ในพอดคาสต์

"เปิดร่องลึกบาดาลมาเรียนา: เปิดเผยความจริงอันน่าสะพรึงกลัวของก้นบึ้ง"

"เปิดร่องลึกบาดาลมาเรียนา: เปิดเผยความจริงอันน่าสะพรึงกลัวของก้นบึ้ง"

บทนำ:ยินดีต้อนรับ ผู้อ่านผู้กล้าหาญ สู่การเดินทางที่จะพาเราไปสู่ความลึกที่มืดมนที่สุดบนโลกใบนี้ ในบล็อกนี้ เราเจาะลึกโลกอันน่าพิศวงของร่องลึกบาดาลมาเรียนา เปิดเผยความลับที่ซ่อนอยู่ และเปิดเผยความจริงอันน่าสะพรึงกลัวที่อยู่ใต้พื้นผิวของมัน

บทสนทนาอันตราย

บทสนทนาอันตราย

หากเราต้องการจะเติบโตบนโลกใบนี้ต่อไป เราจะต้องสนทนาที่อันตราย คนที่ท้าทายสิ่งที่เราทำ สิ่งที่เรากำลังทำ และสิ่งที่เรากำลังจะทำต่อไป (หรือกำลังวางแผนที่จะทำ)

คลังข้อมูลภัยคุกคามนั้น: เล่มที่ 7 Black Basta

คลังข้อมูลภัยคุกคามนั้น: เล่มที่ 7 Black Basta

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