พอดีมีคนถามที่ codenone (http://www.codenone.com/node/687 ว่า file object ของ Python ต่างจาก file descriptor อย่างไร. ผมพยายามจะตอบจากการไปอ่าน code ของ Python 2.5.1 ก็ได้คำตอบมาแบบนี้.
เราสามารถขอ file descriptor ซึ่งเป็นเลขจำนวนเต็มธรรมดาๆ จาก file object ได้โดยใช้ method ชื่อ fileno() ตามตัวอย่างด้านล่าง
fp = open("foo.txt", "a+")
print fp.fileno()
เลขที่ print ออกมาคือ file descriptor. file object ที่หุ้ม file descriptor (fd; ต่อไปขอย่อว่า fd นะ) ไว้อีกที.จริงๆแล้ว file object ของ python ก็ไม่ได้ไปเก็บ fd ไว้ตรงๆ. แต่เก็บ FILE (ของ libc) ไว้. และใน FILE ก็มี fd อีกที.มันเป็น layer ประมาณนี้ (Python)File object -> FILE (libc) -> File descriptor (unix)
ถ้าเราสั่ง open(”foo.txt”) ใน Python. ข้างในมันก็จะไปเรียก
- fopen(”foo.txt”, “r”) ในภาษาซีให้อีก.
- แล้วใน fopen ก็ไปเรียก open(”foo.txt”, flags, mode); ของ unix อีกที (มั้ง ไม่ได้ check code ดู แค่เดาๆ เอา).
- แล้ว open ของ unix นี่หละ return fd ออกมา.
- พอ fopen ได้ fd มาก็จะเอาไปเก็บไว้ แล้ว return file pointer (FILE *) ออกมา ซึ่งข้างในเก็บ fd ไว้.
- open ของ Python ก็ return file object ที่เก็บ file pointer (FILE *) ไว้อีกที.
ผมดูแต่ code ของ Python. ไม่ได้ดูใน code ของ libc เท่าไหร่ อาจจะมีที่ผิดๆมั่วอยู่ได้ อย่างไรก็ตามก็น่าจะพอทำให้เข้าใจคร่าวๆ
ป.ล. สำหรับท่าใส่ source code ใน wordpress เอามาจาก http://wuhrr.wordpress.com/2007/11/09/colorize-your-code-for-free-online/ ขอบใจหลายๆ. ต้อง credit Google ด้วยมั้ง เพราะไม่มี google ก็คงหาไม่เจอ แต่ถ้าไม่มี Internet ก็ไม่มี Google นะ …. พอก่อนละกัน.
ป.ล. (2) แหมอยากจะทำ animation ให้ดูเลย แต่สงสัยเว่อร์ไป