दिलचस्प पोस्ट
एसक्लबफाल्ड क्या है और मुझे क्यों परवाह करना चाहिए? एंड्रॉइड फेसबुक 4.0 एसडीके ईमेल, जन्म तिथि और उपयोगकर्ता का लिंग कैसे प्राप्त करें I पायथन का उपयोग करके पाइथन पैकेज स्थापित करते समय MinGW के जीसीसी कंपाइलर का उपयोग कैसे करें? एमपी 3 अवधि पाने के लिए PHP फ़ंक्शन आर से बाहर एक साफ आर सत्र से बाहर निकलें और पुनरारंभ करें? विजुअल स्टूडियो में डीएलएल की निर्भरताओं को कॉपी करना कैसे एक तत्व के सूचक को एक int सरणी में खोजने के लिए? मुझे कैसे पता चलेगा कि कोई चेकबॉक्स चेक है या नहीं? मोबाइल डिवाइस पर प्रोग्रामिक स्क्रीन कैप्चर आंतरिक एचटीएमएल पर ईलेमेंट बनाने का लाभ? क्या मैं वर्तमान नियंत्रक के नाम को देख सकता हूं? MongoDB परमाणु "खोज या क्रय": ढूंढें, यदि कोई भी न हो तो सम्मिलित करें, लेकिन अपडेट न करें अज्ञात कॉलम में कहां संपर्क बबल संपादन टेक्स्ट Web.config संशोधित होने पर ASP.NET अनुप्रयोग को पुनरारंभ करने से कैसे रोकें?

फ़ंक्शन के नाम से एक स्ट्रिंग से एक मॉड्यूल के फ़ंक्शन को कॉल करना

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

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

वेब के समाधान से एकत्रित समाधान "फ़ंक्शन के नाम से एक स्ट्रिंग से एक मॉड्यूल के फ़ंक्शन को कॉल करना"

विधि bar साथ मॉड्यूल foo मान लें:

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

जहां तक ​​यह जाता है, रेखा 2 और 3 को संपीड़ित किया जा सकता है:

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

अगर वह आपके उपयोग के मामले के लिए और अधिक समझदारी बनाता है आप क्लास getattr बाध्य विधियों, मॉड्यूल-स्तरीय विधियों, क्लास के तरीकों पर इस फैशन में getattr का उपयोग कर सकते हैं … सूची में चला जाता है

 locals()["myfunction"]() 

या

 globals()["myfunction"]() 

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

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

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

बस एक सरल योगदान यदि उदाहरण के लिए हमें जो क्लास की जरूरत है, तो वह उसी फाइल में है, हम ऐसा कुछ इस्तेमाल कर सकते हैं:

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

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

 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

 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) 

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

 functions = {'myfoo': foo.bar} mystring = 'myfoo' if mystring in functions: functions[mystring]() 

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

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

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

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

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

इसे इस्तेमाल करे। यह अभी भी eval का उपयोग करता है, जबकि यह केवल वर्तमान संदर्भ से समारोह को बुलाने के लिए इसका इस्तेमाल करता है। फिर, आपके पास इच्छा के अनुसार उपयोग करने के लिए वास्तविक कार्य है

इस से मेरे लिए मुख्य लाभ यह है कि आप फ़ंक्शन को बुलाने के समय कोई भी eval-related errors प्राप्त करेंगे। फिर आप कॉल करते समय केवल फ़ंक्शन से संबंधित त्रुटियां प्राप्त करेंगे।

 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)