अजगर: मेरे अपने ऑपरेटरों को परिभाषित करना?


80

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


ठीक है, आपके पास एक ऑपरेटर हो सकता है जो परिभाषित नहीं है (जैसे $) और फिर खुद को (साथ open) संपादित करने और सभी a $ bको बदलने के लिए कुछ अजगर कोड का उपयोग करेंfunction(a,b)
whackamadoodle3000

जवाबों:


40

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


1
देखें bellow ऑपरेटरों की पूर्वनिर्धारित overridable सेट के पायथन के सेट के लिए।
पालीमोंडो

179

जबकि तकनीकी रूप से आप पायथन में नए ऑपरेटरों को परिभाषित नहीं कर सकते हैं, यह स्मार्ट हैक इस सीमा के आसपास काम करता है। यह आपको infix ऑपरेटरों को इस तरह परिभाषित करने की अनुमति देता है:

# 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 यह हैक बहुत अच्छा है, लेकिन मुझे नहीं लगता कि यह इस स्थिति में काम करेगा।
जिफ़्रे

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

79
@DasIch मैं इससे अधिक असहमत नहीं हो सकता। हम जानबूझकर किसी भाषा को चुनने के लिए स्वतंत्र नहीं हैं। दूसरी तरफ, मैं नहीं देखता कि मुझे संतुष्ट नहीं होने पर किसी और के डिज़ाइन निर्णयों के साथ समझौता क्यों करना चाहिए। - बहुत बढ़िया हैक!
थॉमस

+1 बहुत ही शांत हैक के लिए, लेकिन मेरा सवाल यह था कि क्या मेरे अपने ऑपरेटरों को परिभाषित करना पायथन में एक विशेषता है या नहीं, यह नहीं कि नकली नए ऑपरेटरों के लिए संभव है या नहीं, और यह प्रतीत होगा कि उत्तर नहीं है, आप नहीं कर सकते नए ऑपरेटरों को परिभाषित करें। हालांकि यह बहुत करीब आता है।
ArtOfWarfare

2
मैं बस के साथ इस संयुक्त pipeसे toolzpip = Infix(lambda x,y: pipe(x,y))। तब 8 |pip| range |pip| sum |pip| range। काम करने लगता है।
कैंटुचिथिस

44

नहीं, पायथन एक पूर्वनिर्धारित, फिर भी अधिक टिकाऊ, ऑपरेटरों के सेट के साथ आता है ।


1
मैं यह जानने के लिए उत्सुक हूं कि dfplyएक -->ऑपरेटर का उपयोग कैसे किया जाता है : aboutdatascience.com/-
मैक्स कैंडोसिया

1
@MaxCandocia जहां तक ​​मैं बता सकता हूं, यह ( डॉक्स नहीं देखें )। उस पोस्ट का उपयोग -->करने वाला उदाहरण psuedocode लगता है। पुस्तकालय में केवल अधिभार होता है >>
एंड्रयू मार्शल

11

ऋषि इस कार्यक्षमता प्रदान करता है, अनिवार्य रूप से @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

देखें साधु प्रलेखन और इस वृद्धि पर नज़र रखने के टिकट अधिक जानकारी के लिए।


10

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


9

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

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

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

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

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


क्या आपका मतलब सिर्फ इतना है कि @एक नया ऑपरेटर प्रतीक है? या कि हम किसी तरह इसका इस्तेमाल अपने खुद के नए ऑपरेटरों को परिभाषित करने के लिए कर सकते हैं?
5

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

5
@Addem वह सिर्फ इसका मतलब था @ एक नया ऑपरेटर है । बस। तथ्य अभी भी बना हुआ है: आप पायथन में अपने स्वयं के ऑपरेटरों को परिभाषित नहीं कर सकते।
जॉन रेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.