>>> a = {} >>> a {} >>> exec "b=4" in a >>> a.keys() ['__builtins__', 'b'] >>> a['b'] 4 >>> a .(lot of error msg)......'OverflowError': <class exceptions.OverflowError at 0xb7d4c9bc>}, 'b': 4}
(python 2.4)
ประโยค exec "b=4" in a มันทำอะไร?
แล้ว __builtins__ ที่เกิดขึ้นใน dict มันคืออะไร
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
อ๋อ อันนี้เป็นของที่ผมชอบใช้
aในโค้ดข้างบนเปรียบเสมือน context ที่เก็บตัวแปรทั้งหมดในระบบไว้ซึ่งปกติจะเป็นglobals()เพราะexecเป็น keyword พิเศษเอาไว้สำหรับรันโค้ดที่ระบุภายใต้ context แยกต่างหาก ถ้าไม่ระบุinตามหลังก็จะไปใช้globals()แทน เรียกใช้ได้หลายแบบexec_stmt ::= "exec" expression ["in" global_and_local ["," local]]ถ้าไม่ระบุ
global_and_localกับlocalก็จะใช้globals()กับlocals()ณ ขณะนั้น แต่ถ้าบอกแค่global_and_localก็จะย้ายทั้งคู่มาอยู่ที่ตัวแปรนี้ ซึ่งควรจะเป็น dict ส่วนถ้าบอกทั้งคู่ก็จะใช้เป็น global และ local ตามลำดับจากโค้ดข้างบนมันก็คือแบบข้างล่างครับ
ซึ่งที่เห็นยาวๆ ในนั้นไม่ใช่ error ครับมันเป็นของที่อยู่ใน
__builtins__ลองดูแบบนี้บ้างถ้าอยากรู้ว่าใน
__builtins__มีอะไรก็แค่ใช้dir()ส่วนa['__builtins__']ใช้.keys()ซึ่งคืออันเดียวกันครับ ถ้าอยากให้สวยๆ ก็ระบุทั้ง global และ local ครับ จะได้สวยๆ
หลังจากอ่านที่คุณสุกรีอธิบายแล้ว ผมก็นั่ง key มั่วไปเรื่อยๆ
ไปสะดุดใจอยู่ตรงนี้อยู่ตั้งนาน
เราก็เห็นว่า builtins เหมือนกัน
ก็ควรจะเป็น object เดียวกันสิ
(ยิ่งเห็นว่า
type(globals())เป็น dict ด้วย)งงอยู่นาน
สุดท้ายก็พอเชื่อมโยงได้
อืมม์ เริ่มสนุกแล้ว(ถึงแม้จะไม่เข้าใจ)
ผมใช้วิธีนี้สำหรับรับคำสั่งจากผู้ใช้เอามารันในตัวโปรแกรมตอน run-time จะได้จำกัดการเข้าถึงตัวแปรในโปรแกรมหลัก