เมื่อใดจึงจะมีประโยชน์ในการใช้อินไลน์การใช้เพียงครั้งเดียวในการนำเข้าใน Python
ตัวอย่างเช่น:
__import__("x").doSomething()
ด้านบนสั้นกว่าด้านล่างหรือไม่?
import x
x.doSomething()
หรือ
from x import*
doSomething()
เมื่อใดจึงจะมีประโยชน์ในการใช้อินไลน์การใช้เพียงครั้งเดียวในการนำเข้าใน Python
ตัวอย่างเช่น:
__import__("x").doSomething()
ด้านบนสั้นกว่าด้านล่างหรือไม่?
import x
x.doSomething()
หรือ
from x import*
doSomething()
คำตอบ:
สิ่งนี้มีประโยชน์หากคุณต้องการใช้โมดูลเพียงครั้งเดียวในฟังก์ชั่นแลมบ์ดานิรนามเนื่องจากจะช่วยให้คุณหลีกเลี่ยงการเขียนคำสั่งแยกต่างหาก:
lambda x:__import__('SomeModule').foo(x,123)
สั้นกว่าหนึ่งไบต์
from SomeModule import*;f=lambda x:foo(x,123)
หากรหัสนั้นมีชื่อฟังก์ชั่นหรือโปรแกรม__import__
อยู่ก็ไม่น่าจะช่วยได้ยกเว้นในสถานการณ์ที่รุนแรงที่สุดหรือเกิดขึ้นจริง
import
จะถูกเรียกภายในบล็อกที่เยื้องหรือไม่? อาจจะไม่.
f=
เนื่องจากอนุญาตให้ใช้ฟังก์ชันที่ไม่ระบุชื่อและสามารถมีเนื้อหานอกฟังก์ชันได้
เมื่อนำเข้าหลายโมดูลที่มีชื่อยาวพอจะเป็นประโยชน์ในการกำหนด__import__
ฟังก์ชันให้กับตัวแปรที่สั้นกว่าและใช้เพื่อการนำเข้า
ข้อความสั่งการนำเข้าปกติ - 97 ไบต์
จากการนำเข้า itertools * จากการนำเข้า datetime * รายการพิมพ์ (เรียงสับเปลี่ยน ("abc")) พิมพ์ datetime.now ()
กำหนด__import__
ให้i
- 94 ไบต์:
i = __ import__ รายการพิมพ์ (i ("itertools"). เรียงสับเปลี่ยน ("abc")) พิมพ์ i ("datetime"). datetime.now ()
__import__("x").doSomething()
ความต้องการ 15+ xตัวละครที่จะอ้างถึงโมดูลที่มีชื่อของความยาวx
import x\nx.doSomething()
ต้องการอักขระ9 + 2 * xตัว ฟังก์ชั่นเหล่านี้ทับซ้อนกันที่x = 6 ดังนั้นเมื่อเปรียบเทียบกับวิธีนี้โมดูลใดที่มีชื่อที่ยาวกว่าจะดีกว่าการใช้__import__
งานสิ่งที่สั้นกว่าจะได้รับประโยชน์จากการนำเข้าปกติ:
อย่างไรก็ตามfrom x import*\ndoSomething()
ต้องการเพียง 14+ xตัวอักษรดังนั้นเมื่อเปรียบเทียบกับการนำเข้าปกติจะไม่คุ้มค่าหากชื่อโมดูลมีความยาวมากกว่า 5 ตัวอักษร:
ทั้งหมดนี้ถือว่าคุณกำลังอ้างถึงฟังก์ชัน / คลาส / อะไรก็ตามเพียงครั้งเดียว หากคุณอ้างถึงมากกว่าหนึ่งครั้งสูตรจะเปลี่ยนไปและรุ่นหลังอาจกลายเป็นผู้ชนะ ในกรณีที่คุณใช้บางสิ่งบางอย่างนานจากโมดูลที่นำเข้าหลายครั้ง แต่รุ่นอื่นชนะ:
from x import y as z
ช่วยให้คุณมีอักขระ18+ x + y + z * ( n +1) สำหรับการใช้nของzซึ่งเป็นการปรับปรุงที่ยิ่งใหญ่ถ้าyมีค่ามากเนื่องจากzสามารถสร้างได้ 1
__import__("x").doSomething()
from x import*;doSomething()
บางทีคุณอาจนับบรรทัดใหม่เป็นสองตัวอักษร? และผมจำได้ทำลายแม้กระทั่งจุดเป็น 5 ตกระหว่างและtime
random
z=__import__("x").y
เป็นไบต์ที่สั้นกว่าfrom x import y as z
from x import*;z=y
สั้น:
__import__
จะช่วยในฟังก์ชั่นที่มีชื่อเพราะมันจะอยู่ในบล็อกเว้าแหว่ง การนำเข้าจะมีค่าใช้จ่ายเพิ่มเติมเนื่องจากเป็นสองบรรทัดและเยื้อง (นั่นคือสมมติว่าการนำเข้าไม่ได้รับอนุญาตนอกฟังก์ชั่น)