def foo(a, b, c = 0):
return a+b
मेरे पास 'foo' जैसे दर्जनों फ़ंक्शन हैं, जिनमें सभी के पास अलग-अलग तर्क संख्याएं और नाम हैं। क्या कोई आम तरीका है कि मैं इन कार्यों के वापसी मूल्य प्राप्त कर सकता हूं और केवल एक अतिरिक्त ऑपरेशन कर सकता हूं जैसे कि उन्हें फ़िल्टर करना?क्या पाइथन में नए फ़ंक्शन को परिभाषित किए बिना फ़ंक्शन के रिटर्न वैल्यू को संशोधित करना संभव है?
func = ... # func can be got using getattr by name
def wrapper(*arg, **kw):
data = func(*arg, **kw)
return pprint.pformat(data)
return wrapper
लेकिन फिर नए कार्य 'आवरण' पुराने एक 'समारोह', उदाहरण के लिए करने के लिए अलग है, तर्क संख्या में, 'आवरण:
हाँ मैं सिर्फ निम्नलिखित की तरह एक नया कार्य उत्पन्न कर सकते हैं 'केवल 2 तर्क हैं-' arg 'और' kw ', लेकिन' func 'में कई तर्क हो सकते हैं, जैसे' ए ',' बी ',' सी '।
मैं सिर्फ वापसी मूल्य के साथ खेलना चाहता हूं, बाकी सब कुछ अभी भी रहना चाहिए, क्या यह संभव है?
धन्यवाद!
अद्यतन अंत में इस समस्या को decorator मॉड्यूल का उपयोग कर हल किया गया था और निम्नलिखित पैच:
--- /home/jaime/cache/decorator-3.2.0/src/decorator.py 2010-05-22 23:53:46.000000000 +0800
+++ decorator.py 2010-10-28 14:55:11.511140589 +0800
@@ -66,9 +66,12 @@
self.name = '_lambda_'
self.doc = func.__doc__
self.module = func.__module__
- if inspect.isfunction(func):
+ if inspect.isfunction(func) or inspect.ismethod(func):
argspec = inspect.getargspec(func)
self.args, self.varargs, self.keywords, self.defaults = argspec
+ if inspect.ismethod(func):
+ self.args = self.args[1:] # Remove the useless 'self' arg
+ argspec = inspect.ArgSpec(self.args, self.varargs, self.keywords, self.defaults)
for i, arg in enumerate(self.args):
setattr(self, 'arg%d' % i, arg)
self.signature = inspect.formatargspec(
इस पैच आप घिरे तरीकों को सजाने के लिए अनुमति देता है, यह सिर्फ पहला 'स्वयं' तर्क फेंक देता है, का उपयोग decorator.decorator वही रहता है, अभी कोई बुरा प्रभाव नहीं मिला है।
उदाहरण कोड:
def __getattr__(self, attr):
def pformat_wrapper(f, *args, **kw):
data = f(*args, **kw)
return pprint.pformat(data, indent = 4)
method = getattr(self.ncapi, attr)
return decorator(pformat_wrapper, method) # Signature preserving decorating
[email protected]:~/bay/dragon.testing/tests$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import decorator
>>> class A:
... def f(self):
... pass
...
>>> a = A()
>>> a.f
<bound method A.f of <__main__.A instance at 0xb774a20c>>
>>> def hello(f, *args, **kw):
... print 'hello'
... return f(*args, **kw)
...
>>> f1 = decorator.decorator(hello, a.f)
>>> f1()
hello
>>>
क्या यह विधि ओवरलोडिंग है? – Tauquir
बीटीडब्ल्यू पायथन विधि ओवरलोडिंग का समर्थन नहीं करता है। – Tauquir
'pprint.pformat' तारों के साथ उपयोग करने योग्य मानों को प्रतिस्थापित करने के लिए अपने कार्यों को बदलना वास्तव में एक वास्तव में खराब विचार (टीएम) है। मत करो। कर। यह। –