python अपने नाम का उपयोग करके मॉड्यूल के फ़ंक्शन को कॉल करना(एक स्ट्रिंग)




विफई कालिंग सैमसंग (8)

बस एक साधारण योगदान। यदि कक्षा जिसे हमें उदाहरण की आवश्यकता है, उसी फ़ाइल में है, हम इस तरह कुछ उपयोग कर सकते हैं:

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

पाइथन प्रोग्राम में फ़ंक्शन के नाम के साथ एक स्ट्रिंग दिए गए फ़ंक्शन को कॉल करने के बारे में जाने का सबसे अच्छा तरीका क्या है। उदाहरण के लिए, मान लीजिए कि मेरे पास मॉड्यूल foo , और मेरे पास एक स्ट्रिंग है जिसका सामग्री "bar"foo.bar() कॉल करने के बारे में जाने का सबसे अच्छा तरीका क्या है?

मुझे फ़ंक्शन का रिटर्न वैल्यू प्राप्त करने की आवश्यकता है, यही कारण है कि मैं केवल eval उपयोग नहीं करता हूं। मुझे पता चला कि एक फ़ंक्शन फ़ंक्शन को परिभाषित करने के लिए eval का उपयोग करके इसे कैसे किया जाए, जो उस फ़ंक्शन कॉल का परिणाम देता है, लेकिन मुझे उम्मीद है कि ऐसा करने का एक और शानदार तरीका है।


इसके लायक होने के लिए, यदि आपको फ़ंक्शन (या कक्षा) नाम और ऐप नाम को स्ट्रिंग के रूप में पास करने की आवश्यकता है, तो आप यह कर सकते हैं:

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)

एक स्ट्रिंग को देखते हुए, एक फ़ंक्शन के लिए एक पूर्ण पायथन पथ के साथ, इस तरह मैंने फ़ंक्शन के परिणाम प्राप्त करने के बारे में बताया:

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

सुझाव दिया गया कोई भी मेरी मदद नहीं की। मैंने हालांकि यह खोजा था।

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

मैं अजगर 2.66 का उपयोग कर रहा हूँ

उम्मीद है की यह मदद करेगा


पायथन प्रोग्रामिंग अकसर किये गए सवाल के अनुसार सबसे अच्छा जवाब होगा:

functions = {'myfoo': foo.bar}

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

इस तकनीक का प्राथमिक लाभ यह है कि तारों को कार्यों के नामों से मेल खाने की आवश्यकता नहीं है। यह एक केस निर्माण का अनुकरण करने के लिए उपयोग की जाने वाली प्राथमिक तकनीक भी है


locals()["myfunction"]()

या

globals()["myfunction"]()

locals वर्तमान स्थानीय प्रतीक तालिका के साथ एक शब्दकोश देता है। ग्लोबल वैश्विक प्रतीक तालिका के साथ एक शब्दकोश देता है।


पैट्रिक का समाधान शायद सबसे साफ है। यदि आपको गतिशील रूप से मॉड्यूल को भी चुनने की आवश्यकता है, तो आप इसे आयात कर सकते हैं:

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




python