python - tutorial - সহজ ভাষায় পাইথন ৩ pdf




গতিশীলভাবে একটি পাইথন ক্লাস লোড কিভাবে (7)

আপনার যদি ইতিমধ্যে আপনার পছন্দসই বর্গের একটি উদাহরণ উপস্থিত থাকে তবে আপনি তার ক্লাসের ধরনটি বের করতে 'টাইপ' ফাংশন ব্যবহার করতে পারেন এবং একটি নতুন উদাহরণ তৈরি করতে এটি ব্যবহার করতে পারেন:

class Something(object):
    def __init__(self, name):
        self.name = name
    def display(self):
        print(self.name)

one = Something("one")
one.display()
cls = type(one)
two = cls("two")
two.display()

পাইথন ক্লাসের স্ট্রিং, যেমন my_package.my_module.MyClass , এটি লোড করার সর্বোত্তম উপায় কী?

অন্য কথায় আমি জাভা সমেত Class.forName() এর জন্য অনুসন্ধান করছি, পাইথন এ ফাংশন। এটি গুগল অ্যাপ ইঞ্জিনে কাজ করতে হবে।

পছন্দসইভাবে এটি একটি ফাংশন হবে যা ক্লাসের FQN একটি স্ট্রিং হিসাবে গ্রহণ করে এবং শ্রেণীতে একটি রেফারেন্স প্রদান করে:

my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()

আপনি Django ব্যবহার করছেন যদি আপনি এই ব্যবহার করতে পারেন। হ্যাঁ আমি জানি ওপেন django এর জন্য জিজ্ঞাসা করা হয়নি, কিন্তু আমি এই প্রশ্নটি জুড়ে দৌঁড়েছিলাম একটি Django সমাধান খুঁজছি, খুঁজে পাইনি, এবং এটি সন্ধান করার জন্য পরবর্তী ছেলে / মেয়েটিকে এখানে রাখি।

# It's available for v1.7+
# https://github.com/django/django/blob/stable/1.7.x/django/utils/module_loading.py
from django.utils.module_loading import import_string

Klass = import_string('path.to.module.Klass')
func = import_string('path.to.module.func')
var = import_string('path.to.module.var')

মনে রাখবেন, যদি আপনি এমন কিছু আমদানি করতে চান যা কোনও না থাকে . , re বা argparse ব্যবহার মত:

re = __import__('re')

এই সমস্যার সমাধান করার চেষ্টা করার সময় আমি __import__ এবং আমি __import__ তে কিছু ভাগ করে __import__

আমি পাইথন 3.7.3 ব্যবহার করছি।

যখন আমি মডিউল abc ক্লাস d পেতে চেষ্টা করি,

mod = __import__('a.b.c')

mod পরিবর্তনশীল শীর্ষ নামস্থান a

সুতরাং ক্লাস d পেতে, আমি প্রয়োজন

mod = getattr(mod, 'b') #mod is now module b
mod = getattr(mod, 'c') #mod is now module c
mod = getattr(mod, 'd') #mod is now class d

আমরা যদি চেষ্টা করি

mod = __import__('a.b.c')
d = getattr(mod, 'd')

আমরা আসলে ad জন্য সন্ধান করার চেষ্টা করছেন।

importlib ব্যবহার করার importlib , আমি মনে করি লাইব্রেরী আমাদের জন্য recursive getattr হয়েছে। সুতরাং, যখন আমরা importlib.import_module ব্যবহার importlib.import_module , আমরা আসলে গভীরতম মডিউলে একটি হ্যান্ডেল পেতে পারি।

mod = importlib.import_module('a.b.c') #mod is module c
d = getattr(mod, 'd') #this is a.b.c.d

গুগল অ্যাপ ইঞ্জিনে webapp2 নামে একটি webapp2 ফাংশন import_string । আরও তথ্যের জন্য এখানে দেখুন: https://webapp-improved.appspot.com/api/webapp2.html

সুতরাং,

import webapp2
my_class = webapp2.import_string('my_package.my_module.MyClass')

উদাহরণস্বরূপ এটি ব্যবহার করা হয় webapp2.Route যেখানে আপনি একটি হ্যান্ডলার বা স্ট্রিং ব্যবহার করতে পারেন।


পাইথন ডকুমেন্টেশন থেকে, আপনি চান ফাংশন এখানে:

def my_import(name):
    components = name.split('.')
    mod = __import__(components[0])
    for comp in components[1:]:
        mod = getattr(mod, comp)
    return mod

কোনও সাধারণ __import__ কাজ করবে না কারণ প্যাকেজ স্ট্রিংয়ের প্রথম বিন্দুটির যেকোনও যেকোনও আমদানি কোনও মডিউলটির একটি বৈশিষ্ট্য যা আপনি আমদানি করছেন। সুতরাং, এই মত কিছু কাজ করবে না:

__import__('foo.bar.baz.qux')

আপনাকে উপরের মত ফাংশন কল করতে হবে:

my_import('foo.bar.baz.qux')

অথবা আপনার উদাহরণের ক্ষেত্রে:

klass = my_import('my_package.my_module.my_class')
some_object = klass()

সম্পাদনা করুন : আমি এই একটি বিট বন্ধ ছিল। আপনি মূলত কি করতে চান এই হল:

from my_package.my_module import my_class

উপরের ফাংশনটি যদি আপনার খালি তালিকা থাকে তবে এটি কেবলমাত্র প্রয়োজনীয়। সুতরাং, উপযুক্ত কল এই মত হবে:

mod = __import__('my_package.my_module', fromlist=['my_class'])
klass = getattr(mod, 'my_class')

def import_class(cl):
    d = cl.rfind(".")
    classname = cl[d+1:len(cl)]
    m = __import__(cl[0:d], globals(), locals(), [classname])
    return getattr(m, classname)

module = __import__("my_package/my_module")
the_class = getattr(module, "MyClass")
obj = the_class()




python-import