software - python tutorial pdf




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

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

আচরণ মত 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")()

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

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


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

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()

এটির মূল্যের জন্য, যদি আপনাকে একটি স্ট্রিং হিসাবে ফাংশন (বা বর্গ) নাম এবং অ্যাপ্লিকেশন নামটি পাস করতে হয় তবে আপনি এটি করতে পারেন:

myFnName  = "MyFn"
myAppName = "MyApp"
app = sys.modules[myAppName]
fn  = getattr(app,myFnName)

পদ্ধতি 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 ব্যবহার করছি

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


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

# 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')

locals()["myfunction"]()

অথবা

globals()["myfunction"]()

locals স্থানীয় প্রতীক টেবিলে একটি অভিধান প্রদান করে। গ্লোবাল প্রতীক গ্লোবাল প্রতীক টেবিলে একটি অভিধান প্রদান করে।







python