เล่นกอล์ฟกับ Python Import


16

เมื่อใดจึงจะมีประโยชน์ในการใช้อินไลน์การใช้เพียงครั้งเดียวในการนำเข้าใน Python

ตัวอย่างเช่น:

__import__("x").doSomething()

ด้านบนสั้นกว่าด้านล่างหรือไม่?

import x
x.doSomething()

หรือ

from x import*
doSomething()

คำตอบ:


11

สิ่งนี้มีประโยชน์หากคุณต้องการใช้โมดูลเพียงครั้งเดียวในฟังก์ชั่นแลมบ์ดานิรนามเนื่องจากจะช่วยให้คุณหลีกเลี่ยงการเขียนคำสั่งแยกต่างหาก:

lambda x:__import__('SomeModule').foo(x,123)

สั้นกว่าหนึ่งไบต์

from SomeModule import*;f=lambda x:foo(x,123)

หากรหัสนั้นมีชื่อฟังก์ชั่นหรือโปรแกรม__import__อยู่ก็ไม่น่าจะช่วยได้ยกเว้นในสถานการณ์ที่รุนแรงที่สุดหรือเกิดขึ้นจริง


__import__จะช่วยในฟังก์ชั่นที่มีชื่อเพราะมันจะอยู่ในบล็อกเว้าแหว่ง การนำเข้าจะมีค่าใช้จ่ายเพิ่มเติมเนื่องจากเป็นสองบรรทัดและเยื้อง (นั่นคือสมมติว่าการนำเข้าไม่ได้รับอนุญาตนอกฟังก์ชั่น)
Alex A.

@AlexA ฉันเห็นว่าไม่มีปัญหากับการวางการนำเข้านอกฟังก์ชั่นที่มีชื่อ
feersum

ถ้าเช่นนั้นจะมีเวลาที่importจะถูกเรียกภายในบล็อกที่เยื้องหรือไม่? อาจจะไม่.
Alex A.

การวางการนำเข้านอกฟังก์ชั่นที่ตั้งชื่อจะไม่ทำงานสำหรับความท้าทายที่คุณกำลังเขียนเพียงหนึ่งฟังก์ชัน
Sparr

6
ตัวอย่างที่สองไม่ต้องการf=เนื่องจากอนุญาตให้ใช้ฟังก์ชันที่ไม่ระบุชื่อและสามารถมีเนื้อหานอกฟังก์ชันได้
xnor

4

เมื่อนำเข้าหลายโมดูลที่มีชื่อยาวพอจะเป็นประโยชน์ในการกำหนด__import__ฟังก์ชันให้กับตัวแปรที่สั้นกว่าและใช้เพื่อการนำเข้า

ตัวอย่าง:

ข้อความสั่งการนำเข้าปกติ - 97 ไบต์

จากการนำเข้า itertools *
จากการนำเข้า datetime *
รายการพิมพ์ (เรียงสับเปลี่ยน ("abc"))
พิมพ์ datetime.now ()

กำหนด__import__ให้i- 94 ไบต์:

i = __ import__
รายการพิมพ์ (i ("itertools"). เรียงสับเปลี่ยน ("abc"))
พิมพ์ i ("datetime"). datetime.now ()

1

แทบจะไม่เคย.

__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


1
คุณตรวจสอบคณิตศาสตร์ของคุณได้ไหม ฉันคิดว่าจะเป็นหนึ่งถ่านสั้นกว่า__import__("x").doSomething() from x import*;doSomething()บางทีคุณอาจนับบรรทัดใหม่เป็นสองตัวอักษร? และผมจำได้ทำลายแม้กระทั่งจุดเป็น 5 ตกระหว่างและtime random
xnor

@ xnor ฉันไม่ได้นับการขึ้นบรรทัดใหม่สองครั้ง แต่ฉันพลาดไปว่าคุณไม่ต้องการจุดในเวอร์ชันนั้น ให้เวลาฉันสักครู่ฉันจะอัปเดต
L3viathan

1
z=__import__("x").yเป็นไบต์ที่สั้นกว่าfrom x import y as z
ลบเจ็ด

1
@negativeseven from x import*;z=yสั้น:
L3viathan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.