पायथन आयात के साथ गोल्फ


16

जब इनलाइन का उपयोग करना फायदेमंद है, तो पायथन में आयात करने वाला एकल उपयोग?

उदाहरण के लिए:

__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__एक नामित फ़ंक्शन के अंदर मदद करेगा क्योंकि यह एक इंडेंट ब्लॉक के अंदर होगा। एक आयात पर अतिरिक्त खर्च होगा क्योंकि यह दो लाइनों और इंडेंट पर है। (यह मानते हुए कि आयात समारोह के बाहर की अनुमति नहीं है।)
एलेक्स ए।

@ एलेक्सा मैं एक नामित फ़ंक्शन के बाहर आयात को रखने के साथ कोई समस्या नहीं देखता हूं।
18 फरवरी को feersum

तब क्या कभी ऐसा समय importहोगा जब किसी इंडेंटेड ब्लॉक को अंदर बुलाया जाएगा? शायद ऩही।
एलेक्स ए।

नामित फ़ंक्शन के बाहर आयात करना उन चुनौतियों के लिए काम नहीं करेगा जहां आप केवल एक फ़ंक्शन लिख रहे हैं।
19

6
दूसरे उदाहरण की आवश्यकता नहीं है f=क्योंकि अनाम फ़ंक्शन की अनुमति है और फ़ंक्शन के बाहर सामग्री हो सकती है
xnor

4

पर्याप्त रूप से लंबे नामों के साथ कई मॉड्यूल आयात करते समय, इसे असाइन करने में मदद मिल सकती है __import__ फ़ंक्शन को एक छोटे चर में करने और आयात के लिए इसका उपयोग करने में मदद मिल सकती है

उदाहरण:

नियमित आयात विवरण - 97 बाइट्स

itertools आयात से *
डाइमटाइम आयात से *
प्रिंट सूची (क्रमपरिवर्तन) ("एबीसी")
प्रिंट डेटाइम.वन ()

असाइन __import__करने के लिए i- 94 बाइट्स:

i = __ import__
प्रिंट सूची (i ("itertools")। क्रमपरिवर्तन ("abc"))
प्रिंट I ("डेटाटाइम")। datetime.now ()

1

लगभग नहीं।

__import__("x").doSomething()लंबाई x के नाम के साथ मॉड्यूल को संदर्भित करने के लिए 15+ x वर्णों की आवश्यकता है ।

import x\nx.doSomething()9 + 2 * x अक्षर चाहिए। ये कार्य एक्स = 6 पर ओवरलैप करते हैं , इसलिए इस तरह की तुलना में लंबे नाम के साथ किसी भी मॉड्यूल का उपयोग करना बेहतर है __import__, सामान्य कीमतों से कुछ भी कम लाभ:

हालांकि, from x import*\ndoSomething()केवल 14+ x वर्णों की आवश्यकता है , इसलिए सामान्य आयात की तुलना में यह इसके लायक नहीं है जब तक कि मॉड्यूल का नाम 5 वर्णों से अधिक लंबा न हो:

यह सब मानता है कि आप एक फ़ंक्शन / वर्ग / जो भी केवल एक बार का उल्लेख कर रहे हैं। यदि आप इसे एक से अधिक बार संदर्भित करते हैं, तो सूत्र बदल जाते हैं, और बाद वाला संस्करण विजेता बन सकता है। यदि आप किसी आयातित मॉड्यूल से कई बार कुछ लंबा उपयोग करते हैं, फिर भी एक और संस्करण जीतता है:

from x import y as zn के z उपयोगों के लिए आपको 18+ x + y + z * ( n +1) अक्षर मिलते हैं , जो कि 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 Shorter from x import*;z=y:।
L3viathan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.