পাইথন আমদানি সহ গল্ফিং


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__একটি নামযুক্ত ফাংশনটির ভিতরে সহায়তা করবে কারণ এটি ইনডেন্টড ব্লকের ভিতরে থাকবে। একটি আমদানিতে অতিরিক্ত ব্যয় হবে যেহেতু এটি দুটি লাইনে এবং ইন্টেন্টেড। (এটি ধরে নেওয়া হচ্ছে যে ফাংশনের বাইরে আমদানির অনুমতি দেওয়া হচ্ছে না))
অ্যালেক্স এ।

@ অ্যালেক্সা আমি কোনও নামকৃত ফাংশনের বাইরে আমদানি স্থাপনে কোনও সমস্যা দেখছি না।
শুক্রবার

তাহলে কি এমন সময় importআসবে যখন ইনডেন্টড ব্লকের ভিতরে ডাকা হবে? সম্ভবত না.
অ্যালেক্স এ।

নামমাত্র ফাংশনের বাইরে আমদানি স্থাপন চ্যালেঞ্জগুলির জন্য কাজ করবে না যেখানে আপনি কেবল একটি ফাংশন লিখছেন।
স্পার

6
দ্বিতীয় উদাহরণটির প্রয়োজন নেই f=কারণ বেনামি ফাংশনগুলি অনুমোদিত এবং ফাংশনের বাইরে সামগ্রী থাকতে পারে
xnor

4

পর্যাপ্ত দীর্ঘ নাম সহ একাধিক মডিউল আমদানি করার সময়, এটি নির্ধারণ করা সহায়ক হতে পারে __import__ ফাংশনটি একটি সংক্ষিপ্ত ভেরিয়েবলের এবং এটি আমদানির জন্য ব্যবহার

উদাহরণ:

নিয়মিত আমদানির বিবৃতি - 97 বাইট

ইটারটুলগুলি আমদানি থেকে *
তারিখের সময় আমদানি থেকে
মুদ্রণ তালিকা (ক্রমানুসারে ("abc"))
মুদ্রণ ডেটটাইম.নো ()

বরাদ্দ করা __import__থেকে i- 94 বাইট:

আমি = __ import__
মুদ্রণ তালিকা (i ("itertools")। অনুমান ("abc"))
আই ("ডেটটাইম") মুদ্রণ করুন

1

প্রায় না.

__import__("x").doSomething()দৈর্ঘ্যের x নামের একটি মডিউল উল্লেখ করতে 15+ 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+ এক্স + + Y + + z- র * ( এন + 1) অক্ষরের জন্য এন ব্যবহার z- র , যা একটি বৃহৎ উন্নতি হলে Y বড়, কারণ z- র 1 করা যেতে পারে।


1
আপনি আপনার গণিত পরীক্ষা করতে পারেন? আমি তার __import__("x").doSomething()চেয়ে এক চর খাটো বলে মনে করি from x import*;doSomething()। আপনি নতুন চরিত্রটিকে দুটি চর হিসাবে গণনা করছেন? এবং আমি বিরতি-এমনকি বিন্দু হচ্ছে 5, মধ্যে পতনশীল প্রত্যাহার timeএবং random
xnor

@ এক্সনর আমি দু'বার নিউলাইনগুলি গণনা করি নি, তবে আমি মিস করেছি যে সেই সংস্করণে আপনার বিন্দুর দরকার নেই। আমাকে এক মিনিট সময় দিন, আমি আপডেট করব।
L3viathan

1
z=__import__("x").y এর চেয়ে বাইট ছোট orter from x import y as z
নেতিবাচক সাত

1
@negativeseven অপেক্ষাকৃত ছোট: from x import*;z=y
L3viathan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.