python tutorial এটির নাম ব্যবহার করে একটি মডিউলটির একটি ফাংশন কল করা(একটি স্ট্রিং)




python tutorial pdf (8)

একটি পাইথন প্রোগ্রামে ফাংশনের নামের সাথে একটি স্ট্রিং দেওয়া একটি ফাংশন কল সম্পর্কে যেতে সর্বোত্তম উপায় কি। উদাহরণস্বরূপ, ধরুন আমার একটি মডিউল foo আছে এবং আমার একটি স্ট্রিং রয়েছে যার বিষয়বস্তু "bar"foo.bar() কে কল করার সেরা উপায় কী?

আমি ফাংশনের ফিরতি মানটি পেতে চাই, এজন্যই আমি eval ব্যবহার করি না। আমি যে ফাংশন কল ফলাফল প্রদান করে একটি temp ফাংশন সংজ্ঞায়িত eval ব্যবহার করে এটি কিভাবে করতে হবে তা figured, কিন্তু আমি আশা করি যে এটি করার আরো মার্জিত উপায় আছে।


পদ্ধতি bar সঙ্গে মডিউল foo অনুমান:

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

যেহেতু যে পর্যন্ত, লাইন 2 এবং 3 সংকুচিত করা যাবে:

result = getattr(foo, 'bar')()

যে আপনার ব্যবহারের ক্ষেত্রে আরো জ্ঞান করে তোলে। আপনি ক্লাসে উদাহরণ আবদ্ধ পদ্ধতি, মডিউল স্তরের পদ্ধতি, ক্লাস পদ্ধতিতে এই ফ্যাশনে getattr ব্যবহার করতে পারেন ... তালিকাটি চলে যায়।


প্রস্তাবিত কোন কি আমাকে সাহায্য করেছে। আমি এই আবিষ্কার যদিও।

<object>.__getattribute__(<string name>)(<params>)

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

আশাকরি এটা সাহায্য করবে


একটি ফাংশনের একটি সম্পূর্ণ পাইথন পাথ সহ একটি স্ট্রিং দেওয়া, আমি কীভাবে ফাংশন ফলাফল পাওয়ার বিষয়ে গিয়েছিলাম:

import importlib
function_string = 'mypackage.mymodule.myfunc'
mod_name, func_name = function_string.rsplit('.',1)
mod = importlib.import_module(mod_name)
func = getattr(mod, func_name)
result = func()

এটা চেষ্টা কর. যদিও এটি এখনও eval ব্যবহার করে, এটি শুধুমাত্র বর্তমান প্রসঙ্গ থেকে ফাংশন আহ্বান এটি ব্যবহার করে । তারপর, আপনি ইচ্ছুক হিসাবে বাস্তব ফাংশন ব্যবহার করতে হবে।

এই থেকে আমার জন্য প্রধান সুবিধাটি হল ফাংশনটি সন্নিবেশ করার সময়ে আপনি কোনও eval-related ত্রুটি পাবেন। তারপর আপনি কল যখন আপনি শুধুমাত্র ফাংশন সংক্রান্ত ত্রুটি পাবেন।

def say_hello(name):
    print 'Hello {}!'.format(name)

# get the function by name
method_name = 'say_hello'
method = eval(method_name)

# call it like a regular function later
args = ['friend']
kwargs = {}
method(*args, **kwargs)

প্যাট্রিক এর সমাধান সম্ভবত পরিষ্কার। যদি আপনি গতিশীলভাবে মডিউলটিও বেছে নিতে চান তবে আপনি এটি আমদানি করতে পারেন:

module = __import__('foo')
func = getattr(module, 'bar')
func()

পাইথন প্রোগ্রামিং প্রশ্নাবলী অনুসারে সেরা উত্তরটি হবে:

functions = {'myfoo': foo.bar}

mystring = 'myfoo'
if mystring in functions:
    functions[mystring]()

এই টেকনিকের প্রাথমিক সুবিধা স্ট্রিংগুলিকে ফাংশনের নামের সাথে মেলে না। এটি একটি কেস কনস্ট্রাক্ট অনুকরণ করতে ব্যবহৃত প্রাথমিক কৌশল


শুধু একটি সহজ অবদান। উদাহরণস্বরূপ যে ক্লাসটি আমাদের প্রয়োজন তা একই ফাইলটিতে থাকলে আমরা এমন কিছু ব্যবহার করতে পারি:

# Get class from globals and create an instance
m = globals()['our_class']()

# Get the function (from the instance) that we need to call
func = getattr(m, 'function_name')

# Call it
func()

উদাহরণ স্বরূপ:

class A:
    def __init__(self):
        pass

    def sampleFunc(self, arg):
        print('you called sampleFunc({})'.format(arg))

m = globals()['A']()
func = getattr(m, 'sampleFunc')
func('sample arg')

# Sample, all on one line
getattr(globals()['A'](), 'sampleFunc')('sample arg')

এবং, যদি না একটি বর্গ:

def sampleFunc(arg):
    print('you called sampleFunc({})'.format(arg))

globals()['sampleFunc']('sample arg')

উত্তর (আমি আশা করি) কেউ কখনও চেয়েছিলেন

আচরণ মত Eval

getattr(locals().get("foo") or globals().get("foo"), "bar")()

স্বয়ং আমদানি কেন যোগ করবেন না

getattr(
    locals().get("foo") or 
    globals().get("foo") or
    __import__("foo"), 
"bar")()

যদি আমাদের অতিরিক্ত অভিধান থাকে তবে আমরা চেক করতে চাই

getattr(next((x for x in (f("foo") for f in 
                          [locals().get, globals().get, 
                           self.__dict__.get, __import__]) 
              if x)),
"bar")()

আমরা গভীর যেতে হবে

getattr(next((x for x in (f("foo") for f in 
              ([locals().get, globals().get, self.__dict__.get] +
               [d.get for d in (list(dd.values()) for dd in 
                                [locals(),globals(),self.__dict__]
                                if isinstance(dd,dict))
                if isinstance(d,dict)] + 
               [__import__])) 
        if x)),
"bar")()




python