पर इंटरसेप्ट ऑपरेटर लुकअप मेरे पास एक कक्षा है जिसे प्रत्येक ऑपरेटर के साथ कुछ जादू करने की आवश्यकता है, जैसे __add__
, __sub__
और इसी तरह।मेटाक्लास
कक्षा में प्रत्येक समारोह बनाने के बजाय, मेरे पास एक मेटाक्लास है जो ऑपरेटर मॉड्यूल में प्रत्येक ऑपरेटर को परिभाषित करता है।
import operator
class MetaFuncBuilder(type):
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
attr = '__{0}{1}__'
for op in (x for x in dir(operator) if not x.startswith('__')):
oper = getattr(operator, op)
# ... I have my magic replacement functions here
# `func` for `__operators__` and `__ioperators__`
# and `rfunc` for `__roperators__`
setattr(self, attr.format('', op), func)
setattr(self, attr.format('r', op), rfunc)
दृष्टिकोण ठीक काम करता है, लेकिन मुझे लगता है कि अगर बेहतर हो तो मैं प्रतिस्थापन ऑपरेटर उत्पन्न करता हूं तो यह बेहतर होगा।
ऑपरेटरों के लुक metaclass पर क्योंकि x + 1
type(x).__add__(x,1)
बजाय x.__add__(x,1)
के रूप में किया जाता है, लेकिन यह __getattr__
है और न ही __getattribute__
विधियों द्वारा पकड़े नहीं है होना चाहिए।
कि काम नहीं करता:
class Meta(type):
def __getattr__(self, name):
if name in ['__add__', '__sub__', '__mul__', ...]:
func = lambda:... #generate magic function
return func
इसके अलावा, जिसके परिणामस्वरूप "समारोह" एक विधि का इस्तेमाल किया उदाहरण के लिए बाध्य किया जाना चाहिए।
इस विचार को मैं कैसे रोक सकता हूं इस पर कोई विचार? मुझे नहीं पता कि यह स्पष्ट है कि मैं क्या करना चाहता हूं।
पूछताछ कारण है कि मैं बात इस तरह का करने की आवश्यकता है उन लोगों के लिए, पूर्ण कोड here की जाँच करें। यह फ़ंक्शन उत्पन्न करने के लिए एक उपकरण है (बस मजेदार) जो lambda
एस के प्रतिस्थापन के रूप में काम कर सकता है।
उदाहरण:
>>> f = FuncBuilder()
>>> g = f ** 2
>>> g(10)
100
>>> g
<var [('pow', 2)]>
बस रिकार्ड के लिए, मैं नहीं चाहता कि एक और तरीका है एक ही बात (मैं वर्ग पर हर एक ऑपरेटर की घोषणा नहीं करेगा करने के लिए जानना चाहता हूँ ... कि हो जाएगा उबाऊ और दृष्टिकोण मैंने बहुत अच्छा काम किया है :)। मैं जानना चाहता हूं कि एक ऑपरेटर से विशेषता लुकअप को कैसे रोकें।
"मेरे पास एक कक्षा है जिसे प्रत्येक ऑपरेटर के साथ कुछ जादू करने की आवश्यकता है" - क्यों? ऐसा लगता है कि आप एक बहुत ही जटिल पेड़ को भड़क रहे हैं ... –
@LennartRegebro मैं किसी ऑब्जेक्ट पर ऑपरेटरों का उपयोग करके फ़ंक्शन जेनरेटर लिख रहा हूं। 'एफ = Funcbuilder(); जी = एफ ** 2 + 1; जी (10) == 101'। यह कुछ बहुत उपयोगी नहीं है (बहुत सारे फ़ंक्शन कॉल), लेकिन इसका उपयोग करने में कुछ मजेदार है: डी – JBernardo
@LennartRegebro मैंने पूरा कोड पोस्ट किया। – JBernardo