মডিউলের ভিতরেই কোনও মডিউলের রেফারেন্স পাবেন কীভাবে?


158

আমি কীভাবে সেই মডিউলটির মধ্য থেকে কোনও মডিউলটির রেফারেন্স পেতে পারি? এছাড়াও, আমি কীভাবে সেই মডিউলযুক্ত প্যাকেজটির একটি রেফারেন্স পেতে পারি?


7
আমার সন্দেহ হয় আপনি সম্ভবত এই প্রশ্নটি জিজ্ঞাসা করছেন কারণ আপনার মডিউল স্কোপ (যেমন, কোনও ফাংশন বা শ্রেণীর বাইরে BLAH = 10), তারপরে BLAH নামে একটি শ্রেণি / ফাংশন ভেরিয়েবল রয়েছে এবং আপনি আলাদা করতে চান। এখানে একটি বৈধ প্রশ্ন: এটি কি প্রয়োজনীয়? স্কোপ বিধিগুলি কুখ্যাতভাবে ভুল প্রবণ হয়, বিশেষত 'ইডিয়ট' দ্বারা যারা আপনার কোড পরে যায় (অর্থাত আপনি, 6 মাস পরে)। এর মতো কৌশলগুলি খুব কমই প্রয়োজনীয়; আমি এগুলিকে সম্পূর্ণরূপে এড়াতে চেষ্টা করি কারণ তারা প্রায়শই বিভ্রান্ত হয় এবং পরে ভুলভাবে পরিবর্তিত হয়।
কেভিন জে রাইস

2
@ কেভিনজে। রাইস "" ইডিয়ট "যিনি আপনার পরে আপনার কোডটি তুলছেন (যেমন, আপনি, 6 মাস পরে)" আমার দিনটি তৈরি করেছেন!
আর্কটেলিক্স

8
কে প্রশ্ন করে কেন সে প্রশ্ন জিজ্ঞাসা করছে? এটি করার জন্য প্রচুর বৈধ কারণ রয়েছে।
ক্রিস্টোফার নাপিত

বন্ধ করা দরকার। খুব দরকারী।
mlvljr

উত্তর:


211
import sys
current_module = sys.modules[__name__]

3
মডিউলটি পুনরায় লোড করা থাকলে এটি পুরোপুরি সঠিক হবে না; আমি মনে করি না এমন কোনও জায়গা আছে যেখানে রেফারেন্স রাখার নিশ্চয়তা রয়েছে, যদি সেখানে থাকে, পুনরায় লোড করা সত্যিই কাজ করবে না, তাই না?
দিমা তিস্নেক

14
পুনরায় লোড করা একই মডিউল অবজেক্টটি পুনরায় ব্যবহার করে; কোনও নতুন মডিউল অবজেক্ট তৈরি করা হয়নি, সুতরাং এটি পুনরায় লোড করার ক্ষেত্রে এখনও সঠিক।
বুকজোর

18

আরও একটি কৌশল, যা সিএস মডিউলটি আমদানি করে না এবং তর্কসাপেক্ষে - আপনার স্বাদের উপর নির্ভর করে - সহজ:

current_module = __import__(__name__)

কোনও আমদানি নেই সচেতন থাকুন। পাইথন প্রতিটি মডিউল কেবল একবার আমদানি করে।


এটি sys আমদানি এড়ানোর একটি দুর্দান্ত উপায় বলে মনে হচ্ছে। পড়ার জন্য কিছুটা পাল্টা স্বজ্ঞাত হওয়া ছাড়া এই পদ্ধতির কোনও সম্ভাব্য ডাউনসাইড রয়েছে কি?
জেরেমিডগ্লাস

@JeremyDouglass। আমার এরকম কিছু জানা নেই. আমদানি একটি বৈধ, নথিভুক্ত, অন্তর্নির্মিত ফাংশন (একমাত্র এক্সএক্স ফাংশন)। আপনি এটিকে 'ইম্পোর্টলিব' প্যাকেজ দিয়ে প্রতিস্থাপন করতে পারেন (আপনাকে এটি আমদানি করতে হবে)। হতে পারে - আমার সাথে কখনও ঘটেনি - আপনার যদি একই নামের মডিউলটি সিএস.প্যাথে উপলব্ধ থাকে তবে আপেক্ষিক / পরম আমদানিতে আপনার সমস্যা হতে পারে, আপনি যদি ফাংশনের 'স্তর' যুক্তি দিয়ে সমাধান করতে পারেন তবে।
উরি

16

যদি আপনার সেই মডিউলে কোনও ক্লাস থাকে, তবে __module__শ্রেণীর সম্পত্তি শ্রেণীর মডিউল নাম। সুতরাং আপনি মাধ্যমে মডিউল অ্যাক্সেস করতে পারেন sys.modules[klass.__module__]। এটি ফাংশনগুলির জন্যও কাজ করে।


4
প্রকৃতপক্ষে, মনে হয় কোনও ফাংশনের জন্য (কমপক্ষে) __module__সম্পত্তিটি কোনও মডিউল নয়, একটি স্ট্রিং; সুতরাং inspect.getabsfile(func.__module__)" TypeError: 'os' মডিউল, শ্রেণি, পদ্ধতি, ফাংশন, ট্রেসব্যাক, ফ্রেম বা কোড অবজেক্ট নয় ; inspect.getabsfile(sys.modules[o.__module__])পাস করার সময় মনে হচ্ছে।
sdaau


1

আপনি বাইরে থেকে এটি প্রবেশ করতে পারেন:

mymod.init(mymod)

আদর্শ নয় তবে এটি আমার বর্তমান ব্যবহারের ক্ষেত্রে কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.