मैंने यहां एक उत्तर खोजने की कोशिश की, लेकिन नहीं कर सका।पायथन सजावट @func()। विशेषता वाक्यविन्यास त्रुटि
@obj.funC# works
@obj.func(**kwargs) #works
@obj.func1(**kwargs).func2 #-> syntax error
मुझे समझ नहीं आता क्यों तीसरा रूप एक सिंटैक्स त्रुटि है, यह मेरे लिए है कि किसी भी अजगर वाक्य रचना का उल्लंघन नहीं कर रहा है और यह मेरे लिए स्पष्ट उपयोगकर्ता क्या करना चाहते हैं क्या है लगता है (नीचे उदाहरण देखें)।
मैंने सजावटी कार्यान्वयन के pep 0318 पर देखा लेकिन मुझे कोई जवाब नहीं मिला।
यहाँ bellow, उपयोग का एक उदाहरण होगा:
class ItemFunc(object):
def __init__(self, fcall=None, **kwargs):
self.defaults = kwargs
self.fcall = None
def __call__(self, *args, **kwargs):
kwargs = dict(self.defaults, **kwargs)
# do something more complex with kwargs
output = self.fcall(*args, **kwargs)
# do something more with output
return output
def caller(self, fcall):
""" set call and return self """
self.call = fcall # after some check obviously
return self
def copy(self,**kwargs):
kwargs = dict(self.defaults, **kwargs)
return self.__class__(self.fcall, **kwargs)
def copy_and_decorate(self, **kwargs):
return self.copy(**kwargs).caller
से आप एक डेकोरेटर के रूप में ItemFunc उपयोग कर सकते हैं:
@ItemFunc
def plot(**kwargs):
pass
redcross = plot.copy(color="red", marker="+")
@redcross.caller
def plot_data1(**kwargs):
pass
bluecross = redcross.copy(color="blue")
@bluecross.caller
def plot_data2(**kwargs):
pass
लेकिन क्यों यह निम्नलिखित 'शॉर्टकट वाक्य रचना' मना किया है:
@redcross.copy(color="blue").caller
def plot_data2(**kwargs):
pass
लेकिन मैं कर सकता हूं:
@redcross.copy_and_decorate(color="blue")
def plot_data2(**kwargs):
pass
पहला फॉर्म अच्छा लगता है, कम से कम मैं पीछे के इरादे को बेहतर समझता हूं।
हाँ, यह एक दार्शनिक समस्या है। मेरे लिए .getter या .caller (जैसे कि मेरे उदाहरण में) के साथ सजावटी को खत्म करना मेरे लिए यह स्पष्ट करता है कि हम क्या करना चाहते हैं, अंत में एक फ़ंक्शन को कॉल करते समय एक कॉलर विधि (मेरा उदाहरण दोबारा) भेज दिया जाता है लेकिन कम पठनीय। क्या आपको नहीं लगता? – user3240484
@ user3240484: मैं देख सकता हूं कि आप अपने सेटअप के साथ कहां जा रहे हैं; लेकिन शायद एक विशेषता का उपयोग करने के बजाय, '__call__' वास्तविक सजावट वापस लौटाता है, जो कुछ '__call__' का समर्थन करता है? –
आप सही हैं, लेकिन यदि आप मेरे उदाहरण को देखते हैं तो __call__ विधि ऑब्जेक्ट फ़ंक्शन-जैसी उपयोगकर्ताओं को रखने के लिए पहले से ही 'fcall' funtion के सजावट की तरह कार्य करती है। मैं एक कॉल फ़ंक्शन द्वारा __call__ को प्रतिस्थापित कर सकता हूं और सजावटी को वापस करने के लिए __call__ का उपयोग कर सकता हूं, लेकिन मैं वहां क्या हासिल करता हूं, मैंने इसे वहां खोला। धन्यवाद – user3240484