2010-10-22 19 views
12

मैं पाइथन कॉल करने योग्य के साथ खेल रहा हूं। असल में आप एक पायथन कक्षा को परिभाषित कर सकते हैं और __call__ विधि को इस वर्ग के कॉल करने योग्य उदाहरण को लागू करने के लिए लागू कर सकते हैं। उदाहरण के लिए,पायथन कॉलबेल के लिए argspec नहीं मिल सकता है?

class AwesomeFunction(object): 
    def __call__(self, a, b): 
     return a+b 

मॉड्यूल निरीक्षण में एक फ़ंक्शन getargspec है, जो आपको फ़ंक्शन का तर्क विनिर्देश देता है। हालांकि, ऐसा लगता है कि मैं एक प्रतिदेय वस्तु पर उसका उपयोग नहीं कर सकते हैं:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/inspect.py", line 803, in getargspec 
    raise TypeError('arg is not a Python function') 
TypeError: arg is not a Python function 

मुझे लगता है कि यह काफी दुर्भाग्यपूर्ण है कि आप समारोह के रूप में किसी भी प्रतिदेय वस्तु का इलाज नहीं कर सकते हैं: दुर्भाग्य से

fn = AwesomeFunction() 
import inspect 
inspect.getargspec(fn) 

, मैं एक लेखन त्रुटि मिला , जब तक कि मैं यहाँ कुछ गलत नहीं कर रहा हूँ?

+0

मुझे कम इस्तेमाल किया है और समझा जादू तरीकों में से एक के बारे में याद करने के लिए धन्यवाद, '__call__' –

उत्तर

6

आप इस कार्यक्षमता की जरूरत है, यह बिल्कुल एक आवरण समारोह है कि अगर fn एक विशेषता __call__ है देखने के लिए जाँच करेगा लिखने के लिए तुच्छ है और अगर यह होता है, getargspec करने के लिए अपने __call__ समारोह गुजरती हैं।

5

यदि आप की inspect मॉड्यूल कोड में svn.python.org पर परिभाषा देखते हैं। आपको लगता है कि यह कॉल isfunction जो अपने आप कॉल देखेंगे:

isinstance(object, types.FunctionType) 

के बाद से, अपने AwesomeFunction स्पष्ट रूप से types.FunctionType का एक उदाहरण यह विफल नहीं है।

आप इसे आप निम्नलिखित का प्रयास करना चाहिए काम करने के लिए करना चाहते हैं:

inspect.getargspec(fn.__call__) 
+5

मैं जानता हूँ कि यह एक समारोह प्रकार की उम्मीद कर रहा है। मैं सिर्फ इस तथ्य को शोक कर रहा हूं कि पायथन ने ऐसे तरीके से डिजाइन नहीं किया जो कार्यों और वस्तुओं को एकजुट करता है। – EnToutCas

+1

यह मुख्य रूप से इसलिए है क्योंकि पायथन एक अपमानजनक वस्तु-उन्मुख भाषा नहीं है (जावा मेरा सबसे अच्छा उदाहरण है)। जावा में, सचमुच सब कुछ एक वस्तु है, उस बिंदु पर जहां चलने योग्य स्रोत की सबसे छोटी इकाई एक वर्ग है। पायथन में, चूंकि इस तरह के प्रतिमान को छोड़ दिया गया था, हां, कुछ विशेषताएं गायब हैं, लेकिन यह आमतौर पर स्पष्ट है। –

+0

@EnToutCas: एक प्रस्ताव/पैच लिखें। शायद या तो ए) स्वीकार किया जाए, या बी) एक तर्क के साथ गोली मार दी जो दर्शाता है कि यह एक बुरा विचार क्यों है। –

0

__call__ कुछ है कि एक वर्ग उदाहरण से कहा जा सकता है परिभाषित करता है। आप getargspec को एक वैध फ़ंक्शन नहीं दे रहे हैं क्योंकि आप इसे क्लास इंस्टेंस पास कर रहे हैं।

__init और __call__ के बीच अंतर यह है:

fn = AwesomeFunction() # call to __init__ 
fn(1, 2) # call to __call__ 
संबंधित मुद्दे