2009-05-31 13 views
50

मैं अपना खुद का ऑपरेटर परिभाषित करना चाहता हूं। क्या पाइथन ऐसी चीज का समर्थन करता है?पायथन: अपने स्वयं के ऑपरेटरों को परिभाषित करना?

+0

ठीक है, आपके पास एक ऑपरेटर हो सकता है जिसे परिभाषित नहीं किया गया है (जैसे '$') और उसके बाद कुछ पायथन कोड का उपयोग स्वयं को संपादित करने के लिए करें ('ओपन' के साथ) और' $ b' 'को' फ़ंक्शन 'में बदलें (ए, बी) ' –

उत्तर

25

नहीं, आप नए ऑपरेटरों को नहीं बना सकते हैं। हालांकि, अगर आप केवल अभिव्यक्तियों का मूल्यांकन कर रहे हैं, तो आप स्वयं स्ट्रिंग को संसाधित कर सकते हैं और नए ऑपरेटरों के परिणामों की गणना कर सकते हैं।

+0

पाइथन के ऑपरेटरों के पूर्वनिर्धारित ओवर्रिडेबल सेट के सेट के लिए [bellow] (http://stackoverflow.com/questions/932328/python-defining-my-own-operators#932333) देखें। – Palimondo

35

नहीं, पायथन एक पूर्वनिर्धारित, अभी तक अतिरंजित, set of operators के साथ आता है।

7

आप वस्तुओं के एक विशेष वर्ग पर कार्रवाई लागू करना चाहते हैं, तो आप सिर्फ ऑपरेटर अपने कार्य करीबी से मेल खाता है रद्द कर सकते थे, उदाहरण के लिए ... __eq__() अधिभावी == ऑपरेटर को पार कर जाएगी जो चाहो वापस जाने के लिए। यह लगभग सभी ऑपरेटरों के लिए काम करता है।

143

तकनीकी रूप से आप पाइथन में नए ऑपरेटरों को परिभाषित नहीं कर सकते हैं, यह clever hack इस सीमा के आसपास काम करता है।

# simple multiplication 
x=Infix(lambda x,y: x*y) 
print 2 |x| 4 
# => 8 

# class checking 
isa=Infix(lambda x,y: x.__class__==y.__class__) 
print [1,2,3] |isa| [] 
print [1,2,3] <<isa>> [] 
# => True 
+2

+1 हैक बहुत अच्छा है, लेकिन मुझे नहीं लगता कि यह इस स्थिति में काम करेगा। – Zifre

+7

यह एक इंटरस्टिंग हैक हो सकता है लेकिन मुझे नहीं लगता कि यह एक अच्छा समाधान है। पाइथन अपने ऑपरेटरों को बनाने की इजाजत नहीं देता है, एक अच्छा निर्णय के लिए एक डिजाइन निर्णय जो आपको बनाया गया था और इसे इसे एक समस्या के रूप में देखने और इसके आसपास के तरीकों की खोज करने के बजाय इसे स्वीकार करना चाहिए। उस भाषा के खिलाफ लड़ना एक अच्छा विचार नहीं है जिसमें आप कोड लिख रहे हैं। यदि आप वास्तव में चाहते हैं कि आपको एक अलग भाषा का उपयोग करना चाहिए। – DasIch

+50

@DasIch मैं और असहमत नहीं हो सका। हम जानबूझकर एक भाषा चुनने के लिए स्वतंत्र नहीं हैं। दूसरी ओर, मुझे नहीं लगता कि अगर मैं संतुष्ट नहीं हूं तो मुझे किसी और के डिजाइन निर्णयों के साथ क्यों निपटना चाहिए। - वास्तव में उत्कृष्ट हैक! – ThomasH

6

साधु अनिवार्य रूप से "चालाक हैक" @Ayman Hourieh द्वारा वर्णित का उपयोग कर, यह सुविधा प्रदान करता है, लेकिन एक डेकोरेटर के रूप में एक मॉड्यूल में शामिल एक क्लीनर उपस्थिति और अतिरिक्त देने के लिए: यह आप इस तरह इन्फ़िक्स ऑपरेटरों को परिभाषित करने की अनुमति देता है कार्यक्षमता - आप ओवरलोड करने के लिए ऑपरेटर चुन सकते हैं और इसलिए मूल्यांकन का आदेश।

from sage.misc.decorators import infix_operator 

@infix_operator('multiply') 
def dot(a,b): 
    return a.dot_product(b) 
u=vector([1,2,3]) 
v=vector([5,4,3]) 
print(u *dot* v) 
# => 22 

@infix_operator('or') 
def plus(x,y): 
    return x*y 
print(2 |plus| 4) 
# => 6 

the Sage documentation और अधिक जानकारी के लिए this enhancement tracking ticket देखें।

6

पायथन 3.5 अतिरिक्त ऑपरेटर के लिए @ प्रतीक प्रस्तुत करता है।

PEP465 ने कई संख्यात्मक कोड के संकेत को सरल बनाने के लिए मैट्रिक्स गुणा के लिए इस नए ऑपरेटर को पेश किया। ऑपरेटर सभी प्रकार के लिए लागू नहीं किया जाएगा, लेकिन केवल सरणी जैसी वस्तुओं के लिए।

__matmul__() लागू करके आप अपने वर्ग/वस्तुओं के लिए ऑपरेटर का समर्थन कर सकते हैं।

पीईपी गैर-सरणी जैसी वस्तुओं के लिए ऑपरेटर के एक अलग उपयोग के लिए जगह छोड़ देता है।

बेशक आप @ के साथ मैट्रिक्स गुणा से अलग किसी भी प्रकार के ऑपरेशन को एरेज़ जैसी वस्तुओं के लिए भी कार्यान्वित कर सकते हैं, लेकिन उपयोगकर्ता का अनुभव प्रभावित होगा, क्योंकि हर कोई आपके डेटा प्रकार को अलग तरीके से व्यवहार करने की अपेक्षा करेगा।

+0

क्या आपका मतलब यह है कि '@' एक नया ऑपरेटर प्रतीक है? या हम किसी भी तरह से इसका इस्तेमाल अपने नए ऑपरेटरों को परिभाषित करने के लिए कर सकते हैं? – Addem

+0

हां, @ एक नया ऑपरेटर प्रतीक है। हां, आप इसका इस्तेमाल अपनी वस्तुओं पर संचालन को परिभाषित करने के लिए कर सकते हैं। पीईपी 465 पढ़ने पर विचार करें। – gg349

+3

@Addem वह बस मतलब था कि '@' एक नया ऑपरेटर है। बस। तथ्य अभी भी बनी हुई है: आप पाइथन में अपने आप के ऑपरेटरों को परिभाषित नहीं कर सकते हैं। –

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