2012-10-11 13 views
11

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

# filename: foo.py 
import sys 

def bar(): 
    print 'Hello, called bar()!' 

if __name__ == '__main__': 
    funcname = 'bar' 
    # Here I should be able to call bar() from funcname 

मुझे पता है कि 'गेटैटर' नामक पायथन में कुछ अंतर्निहित फ़ंक्शन मौजूद हैं। हालांकि, इसे 'पैरामीटर ऑब्जेक्ट' को पहला पैरामीटर होने की आवश्यकता है। वर्तमान मॉड्यूल के 'मॉड्यूल ऑब्जेक्ट' को कैसे प्राप्त करें?

उत्तर

21

globals शायद समझना आसान है। यह वर्तमान मॉड्यूल के __dict__ देता है, तो आप कर सकता है:

func_I_want = globals()['bar'] #Get the function 
func_I_want() #call it 

आप वास्तव में मॉड्यूल वस्तु चाहते हैं, आप इसे sys.modules से प्राप्त कर सकते हैं (लेकिन आप आमतौर पर इसकी आवश्यकता नहीं है):

import sys.modules 
this_mod = sys.modules[__name__] 
func = getattr(this_mod,'bar') 
func() 

ध्यान दें कि सामान्य रूप से, आपको खुद से पूछना चाहिए कि आप ऐसा क्यों करना चाहते हैं। यह किसी भी फंक्शन को स्ट्रिंग के माध्यम से बुलाए जाने की अनुमति देगा - जो शायद उपयोगकर्ता इनपुट है ... यदि आप गलती से उपयोगकर्ताओं को गलत कार्यों तक पहुंच प्रदान करते हैं तो इसका संभावित दुष्प्रभाव हो सकता है।

10

एक शब्दकोश है कि कार्यों की मैपिंग आप कॉल करना चाहते रहता है उपयोग:

if __name__ == '__main__': 
    funcnames = {'bar': bar} 
    funcnames['bar']() 
+0

मैं हमेशा एक जवाब है कि उसे/उसके बजाय ओपी के _problem_ हल करती है की सराहना करते हैं _सवाल_। +1 – gboffi

0

कैसे इस बारे में:

eval('bar' + '()') 
संबंधित मुद्दे