पायथन में ऑब्जेक्ट्स के इंस्टेंस वेरिएबल और मेथड एट्रिब्यूट के रूप में होते हैं। फ़ंक्शन नाम की स्ट्रिंग से मॉड्यूल का फ़ंक्शन कॉल करने के लिए, आप पहले इस एट्रिब्यूट को प्राप्त कर सकते हैं और उससे जुड़े फ़ंक्शन ऑब्जेक्ट को कॉल कर सकते हैं।
उदाहरण
मान लें कि मेरे पास एक मॉड्यूल `foo` है, और मेरे पास एक स्ट्रिंग है जिसकी सामग्री `"bar"` है। `foo.bar()` कॉल करने का सबसे अच्छा तरीका है:
>> import foo
>>> method_to_call = getattr(foo, 'bar')
>>> result = method_to_call()
ग्लोबल/लोकल नेमस्पेस से
यदि आपके पास मॉड्यूल प्रीफिक्स के बिना ग्लोबल या लोकल नेमस्पेस में फ़ंक्शन है, तो आप `globals()`/`locals()` का भी उपयोग कर सकते हैं। `locals` वर्तमान लोकल सिंबल टेबल के साथ एक डिक्शनरी लौटाता है। `globals` ग्लोबल सिंबल टेबल के साथ एक डिक्शनरी लौटाता है।
उदाहरण
>> result = locals()["myfunction"]()
# या
>>> result = globals()["myfunction"]()
सुरक्षित दृष्टिकोण: डिक्शनरी मैपिंग
# सुरक्षित तरीका - अनुमत फ़ंक्शन की व्हाइटलिस्ट
ALLOWED_FUNCTIONS = {
'func_a': func_a,
'func_b': func_b,
'func_c': func_c,
}
def call_function(name, *args, **kwargs):
if name not in ALLOWED_FUNCTIONS:
raise ValueError(f"Function {name} not allowed")
return ALLOWED_FUNCTIONS[name](*args, **kwargs)
# उपयोग
result = call_function('func_a', arg1, arg2)
importlib के साथ डायनामिक इम्पोर्ट + कॉल
import importlib
def call_module_function(module_name, func_name, *args, **kwargs):
module = importlib.import_module(module_name)
func = getattr(module, func_name)
return func(*args, **kwargs)
# उपयोग
result = call_module_function('math', 'sqrt', 16) # 4.0
result = call_module_function('os.path', 'join', 'a', 'b') # 'a/b'
सुरक्षा चेतावनी
- कभी भी अविश्वसनीय इनपुट पर `eval()` या `exec()` का उपयोग न करें
- `getattr`/`globals()` अनुमत नामों की व्हाइटलिस्ट के साथ उपयोग करें
- इंजेक्शन हमलों से बचने के लिए इनपुट मान्य करें
उपयोग के मामले
- प्लगइन सिस्टम
- कमांड पैटर्न कार्यान्वयन
- कॉन्फ़िगरेशन-चालित निष्पादन
- RPC/एपीआई डिस्पैचिंग