python - "()" का उपयोग किए बिना जब कुंजी को एक्सेस किया जाता है, तो फ़ंक्शन के रूप में शब्दकोष्ठ मान को कॉल किया जाना चाहिए




python-2.7 function (3)

मुझे नहीं लगता कि मानक पुस्तकालय के साथ संभव है (आसानी से), लेकिन आप lazy_object_proxy.Proxy प्रयोग मॉड्यूल lazy_object_proxy से कर सकते हैं (यह तीसरी पार्टी है ताकि आपको इसे स्थापित करने की आवश्यकता हो):

>>> import lazy_object_proxy
>>> def fn_1():
...     print('calculation')
...     return 1000
...
>>> d = {1: "A", 2: "B", 3: lazy_object_proxy.Proxy(fn_1)}
>>> print(d[3])
calculation
1000

मेरे पास एक शब्दकोश है जिसे कई बार स्ट्रिंग्स के रूप में मान किया गया है, और कभी-कभी फ़ंक्शन के रूप में। फ़ंक्शन के मानों के लिए फ़ंक्शन निष्पादित करने का एक तरीका है जब बिना कुंजी को एक्सेस किया जाता है () लिखने के बिना?

उदाहरण:

d = {1: "A", 2: "B", 3: fn_1}
d[3]() # To run function

मुझे चाहिए:

d = {1: "A", 2: "B", 3: magic(fn_1)}
d[3] # To run function

callable() करने callable() का प्रयोग करें, यह जांचने के लिए कि क्या चर है, ठीक है, कॉल करने योग्य है:

d = {1: "A", 2: "B", 3: fn_1}
if callable(d[3]):
    d[3]()
else:
    d[3]

एक अन्य संभावित समाधान, एक कस्टम शब्दकोश ऑब्जेक्ट बनाना है जो इस व्यवहार को लागू करता है:

>>> class CallableDict(dict):
...     def __getitem__(self, key):
...         val = super().__getitem__(key)
...         if callable(val):
...             return val()
...         return val
...
>>>
>>> d = CallableDict({1: "A", 2: "B", 3: lambda: print('run')})
>>> d[1]
'A'
>>> d[3]
run

शायद अधिक मुहावरेदार समाधान का try/except करने के लिए उपयोग किया जाएगा try/except :

def __getitem__(self, key):
    val = super().__getitem__(key)
    try:
        return val()
    except TypeError:
        return val

नोट हालांकि ऊपर की विधि वास्तव में पूर्णता के लिए है। मैं इसे का उपयोग कर reccomend नहीं होगा। जैसा कि टिप्पणियों में बताया गया है , यह फंक्शन द्वारा उठाए गए TypeError को मास्क करेगा। आप TypeError की सटीक सामग्री का परीक्षण कर सकते हैं, लेकिन उस समय, आप LBYL शैली का उपयोग करने के लिए बेहतर होंगे





callback