2010-10-22 14 views
5
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 
>>> 
+0

क्या यह विधि ओवरलोडिंग है? – Tauquir

+0

बीटीडब्ल्यू पायथन विधि ओवरलोडिंग का समर्थन नहीं करता है। – Tauquir

+0

'pprint.pformat' तारों के साथ उपयोग करने योग्य मानों को प्रतिस्थापित करने के लिए अपने कार्यों को बदलना वास्तव में एक वास्तव में खराब विचार (टीएम) है। मत करो। कर। यह। –

उत्तर

3

आपकी समस्या के बारे में:

"लेकिन उसके बाद नए समारोह 'आवरण' पुराने एक 'समारोह' के लिए अलग है, उदाहरण के लिए, >> तर्क संख्या में, 'आवरण' केवल 2 है तर्क - 'arg' और 'kw', लेकिन 'func' में कई >> तर्क हो सकते हैं, जैसे 'ए', 'बी', 'सी'। "

आप decorator मॉड्यूल जो एक हस्ताक्षर के संरक्षण सज्जाकार बनाने के लिए सक्षम उपयोग कर सकते हैं।

+0

+1 को संरक्षित करता है। यह वास्तव में शक्तिशाली है। इसके अलावा [वीनसियन] (http://pypi.python.org/pypi/venusian) सजावटी से निपटने के दौरान उपयोगी हो सकता है। –

+0

सजावटी मॉड्यूल लगभग समस्याओं को हल करता है, लेकिन ऐसा लगता है कि बाध्य या अनबाउंड विधियों के साथ काम नहीं करता है। "इसके अलावा, ध्यान दें कि आप एक विधि को सजाने के लिए कर सकते हैं, लेकिन केवल बाध्य या अनबाउंड विधि बनने से पहले, यानी वर्ग के अंदर ....", तो यह बेकार है यदि आप कक्षा के कुछ तरीकों को अपने स्रोत कोड को संशोधित किए बिना सजाना चाहते हैं जहा तक मै देख सकता हू। – jaimechen

2

डेकोरेटर।

from functools import wraps 
def pformat_this(someFunc): 
    @wraps(someFunc) 
    def wrapper(*arg, **kw): 
     data = someFunc(*arg, **kw) 
     return pprint.pformat(data) 
    return wrapper 


@pformat_this 
def foo(a, b, c = 0): 
    return a+b 
+0

क्या यह @ pformat_this' नहीं होना चाहिए? –

+2

@ एस लूट: functools.wrap हस्ताक्षर-संरक्षित सजावटी नहीं है, यह सजावटी मॉड्यूल का उल्लेख करने के लिए बस _ _name_ _ और _ _doc_ _ – mouad

2

सजावटी अनिवार्य रूप से वही हैं जो आप नहीं चाहते हैं।

उत्सुक हो रहा है, मैंने इसे अजगर 2.7 के लिए देखा, और पाया कि a wealth of meta information available for user defined functions कॉलबल प्रकारों -> उपयोगकर्ता परिभाषित कार्यों के तहत है। दुर्भाग्यवश, लौटा मूल्य के बारे में कुछ भी नहीं है।

आंतरिक प्रकार -> कोड ऑब्जेक्ट्स के तहत the same page पर फ़ंक्शन, कोड ऑब्जेक्ट के माध्यम से आप एक आंतरिक प्रकार भी एक्सेस कर सकते हैं। भले ही इन आंतरिक प्रकारों को अनिवार्य रूप से एपीआई स्थिरता के लिए कोई वादा नहीं किया गया हो, फिर भी वहां लौटाए गए मूल्य के संबंध में कुछ भी लिखने योग्य नहीं लगता है।

मुझे एहसास है कि अगर कुछ भी आप सीधे कर सकते हैं, तो यह यहां होगा। उम्मीद है कि किसी और के लिए आपके लिए बेहतर भाग्य है।

संबंधित मुद्दे