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




5 Answers

locals()["myfunction"]()

অথবা

globals()["myfunction"]()

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

python

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

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




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

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



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

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



এটা চেষ্টা কর. যদিও এটি এখনও 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)





Related


Tags

python