2012-08-02 15 views
9

के साथ कॉल फ़ंक्शन कॉल करने के लिए पायथन का उपयोग करके मैं एक चर के आधार पर विभिन्न कार्यों को कॉल करने के लिए getattr का उपयोग कर रहा हूं।चरम पैरामीटर

इम ऐसा ही कुछ कर रही है:

getattr(foo, bar)() 

, काम करता है यही कारण है कि foo.bar जैसे कार्यों() कॉल

मेरे समस्या मैं 'बार' कार्य होते हैं कि और मैं अलग से कॉल करने के लिए चाहते हैं मापदंडों। उदाहरण के लिए:

def f1() : 
    pass 

def f2(param1) : 
    pass 

def f3(param1,param2) : 
    pass 

तो 'बार' F1, F2, या f3

मैं इस कोशिश की हो सकता है: कि पैरामीटर assumming एक सूची है जो 'बार' समारोह के लिए आवश्यक सभी पैरामीटर शामिल है

getattr(foo, bar) (for p in params :) 

जरूरत नहीं चर पैरामीटर

उत्तर

16

आप की तरह कुछ की कोशिश कर सकते पर लंबाई को देखने के लिए के साथ मैं एक "क्लीन" समाधान के लिए देख रहा है:

getattr(foo, bar)(*params) 

यह काम करता है यदि params एक सूची या टुपल है। params से तत्वों क्रम में अनपैक किया जाएगा:

params=(1, 2) 
foo(params[0], params[1]) 

कीवर्ड तर्क नहीं हैं, तो आप ऐसा भी कर सकते हैं:

params=(1, 2) 
foo(*params) 

के बराबर है।

getattr(foo, bar)(*params, **keyword_params) 

जहां keyword_params एक शब्दकोश है।

इसके अलावा, यह उत्तर वास्तव में getattr से स्वतंत्र है। यह किसी भी समारोह/विधि के लिए काम करेगा।

+2

मुझे पता है कि ओपी ने विशेष रूप से नहीं पूछा था, लेकिन मैं '** kwargs' भी जोड़ूंगा, इसलिए वह कीवर्ड तर्कों का उपयोग करने का प्रयास करने के बाद बाद में बग को ट्रैक करने के लिए कड़ी मेहनत नहीं कर पाएगा। –

+0

@ sr2222 - जोड़ा गया। – mgilson