আমি একটি পাইথন অ্যাপ্লিকেশন লিখছি যা একটি আর্গুমেন্ট হিসাবে একটি আদেশ হিসাবে গ্রহণ করে, উদাহরণস্বরূপ:
$ python myapp.py command1
আমি চাইছি অ্যাপ্লিকেশনটি এক্সটেনসিবল হোক, অর্থাত্ মূল অ্যাপ্লিকেশন উত্সটি পরিবর্তন না করেই নতুন কমান্ড প্রয়োগকারী নতুন মডিউল যুক্ত করতে সক্ষম হোন। গাছটি দেখতে এমন কিছু দেখাচ্ছে:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
সুতরাং আমি অ্যাপ্লিকেশনটি রানটাইমের সময় উপলভ্য কমান্ড মডিউলগুলি সন্ধান করতে এবং উপযুক্তটিকে সম্পাদন করতে চাই।
পাইথন একটি __Import__ ফাংশন সংজ্ঞায়িত করে, যা মডিউল নামের জন্য একটি স্ট্রিং নেয়:
__ গুরুত্বপূর্ণ __ (নাম, গ্লোবালস = কোনও নয়, স্থানীয় = কোনওটি নেই, তালিকা = () স্তর = 0)
প্যাকেজ প্রসঙ্গে কীভাবে নামটি ব্যাখ্যা করা যায় তা নির্ধারণ করতে ফাংশনটি প্রদত্ত গ্লোবাল এবং স্থানীয়দের ব্যবহার করে মডিউলটির নাম আমদানি করে। নাম তালিকা মডিউল থেকে আমদানি করা উচিত এমন বস্তু বা সাবমডিউলগুলির নাম দেয় list
উত্স: https://docs.python.org/3/library/function.html# আমদানি
সুতরাং বর্তমানে আমার মতো কিছু রয়েছে:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
এটি ঠিকঠাক কাজ করে, আমি কেবল ভাবছি যে এই কোডটি দিয়ে আমরা কী করছি তা সম্পাদন করার জন্য আরও কোনও মূর্খ উপায় আছে কিনা।
নোট করুন যে আমি বিশেষত ডিম বা এক্সটেনশন পয়েন্ট ব্যবহার করতে চাই না। এটি কোনও ওপেন সোর্স প্রকল্প নয় এবং আমি "প্লাগইন" থাকার আশা করি না। মূল বক্তব্যটি হ'ল মূল অ্যাপ্লিকেশন কোডটি সরল করা এবং প্রতিবার নতুন কমান্ড মডিউল যুক্ত হওয়ার পরে এটি সংশোধন করার প্রয়োজনীয়তা সরিয়ে ফেলা উচিত।
dir(__import__)
। "নাম আমদানি থেকে ..." অনুকরণ করার জন্য তালিকা থেকে নামগুলির তালিকা হওয়া উচিত।
importlib
: স্ট্যাকওভারফ্লো.com