मुझे पता है कि फ़ंक्शन तुलना पाइथन 3 (केवल स्मृति में पता की तुलना में) में कैसे काम करती है, और मैं समझता हूं कि क्यों।समानता के लिए सरल अज्ञात पायथन कार्यों का परीक्षण करने के लिए एक ह्युरिस्टिक विकसित करना
मैं यह भी समझता हूं कि "सत्य" तुलना (f
और g
कार्य करता है, वही परिणाम देता है, किसी भी तर्क के लिए, समान तर्क देता है?) व्यावहारिक रूप से असंभव है।
मैं बीच में कुछ ढूंढ रहा हूं। मैं तुलना समान कार्यों का सरलतम मामलों पर काम करना चाहता है, और संभवतः कुछ कम तुच्छ लोगों:
lambda x : x == lambda x : x # True
lambda x : 2 * x == lambda y : 2 * y # True
lambda x : 2 * x == lambda x : x * 2 # True or False is fine, but must be stable
lambda x : 2 * x == lambda x : x + x # True or False is fine, but must be stable
ध्यान दें कि मैं गुमनाम कार्य (lambda
) के लिए इस समस्या को हल करने में रुचि है, लेकिन कोई फ़र्क नहीं पड़ेगा अगर समाधान नामित कार्यों के लिए भी काम करता है।
इसके लिए प्रेरणा यह है कि blist
मॉड्यूल के अंदर, यह सत्यापित करना अच्छा होगा कि दो sortedset
उदाहरणों पर यूनियन करने से पहले एक ही तरह का कार्य होता है।
नामित फ़ंक्शंस कम रुचि वाले हैं क्योंकि मैं उन्हें अलग होने पर अलग मान सकता हूं। आखिरकार, मान लें कि किसी ने key
तर्क में नामित फ़ंक्शन के साथ दो सॉर्टिडेट बनाए हैं। यदि वे इन परिचालनों को सेट ऑपरेशंस के प्रयोजनों के लिए "संगत" होने का इरादा रखते हैं, तो वे संभवतः एक ही कार्य का उपयोग करेंगे, दो अलग-अलग नामित फ़ंक्शंस जो समान संचालन करते हैं।
मैं केवल तीन दृष्टिकोणों के बारे में सोच सकता हूं। वे सभी कड़ी मेहनत करते हैं, इसलिए किसी भी विचार की सराहना की।
तुलना bytecodes काम हो सकता है, लेकिन यह कष्टप्रद है कि यह कार्यान्वयन निर्भर है हो सकता है (और इसलिए कोड है कि एक अजगर पर काम किया दूसरे पर टूट जाता है)।
टोकनयुक्त स्रोत कोड की तुलना करना उचित और पोर्टेबल लगता है। बेशक, यह कम शक्तिशाली है (क्योंकि समान कार्यों को अस्वीकार करने की अधिक संभावना है)।
कुछ प्रतीकात्मक गणना पाठ्यपुस्तक से उधार ली गई एक ठोस ह्युरिस्टिक सैद्धांतिक रूप से सबसे अच्छी दृष्टिकोण है। यह मेरे उद्देश्य के लिए बहुत भारी प्रतीत हो सकता है, लेकिन यह वास्तव में एक अच्छा फिट हो सकता है क्योंकि लैम्ब्डा फ़ंक्शन आमतौर पर छोटे होते हैं और इसलिए यह तेज़ दौड़ जाएगा।
संपादित
एक अधिक जटिल उदाहरण, @delnan द्वारा टिप्पणी के आधार पर:
# global variable
fields = ['id', 'name']
def my_function():
global fields
s1 = sortedset(key = lambda x : x[fields[0].lower()])
# some intervening code here
# ...
s2 = sortedset(key = lambda x : x[fields[0].lower()])
मैं s1
और s2
के लिए महत्वपूर्ण कार्य के रूप में बराबर का मूल्यांकन करने के लिए उम्मीद करेंगे?
यदि हस्तक्षेप कोड में कोई फ़ंक्शन कॉल शामिल है, तो fields
का मान संशोधित किया जा सकता है, जिसके परिणामस्वरूप s1
और s2
के लिए विभिन्न महत्वपूर्ण कार्य होते हैं। चूंकि हम स्पष्ट रूप से इस समस्या को हल करने के लिए नियंत्रण प्रवाह विश्लेषण नहीं करेंगे, इसलिए यह स्पष्ट है कि हमें इन दो लैम्ब्डा कार्यों को अलग-अलग मूल्यांकन करना होगा, अगर हम रनटाइम से पहले इस मूल्यांकन को करने का प्रयास कर रहे हैं। (भले ही fields
वैश्विक नहीं था, हो सकता है कि इसका कोई दूसरा नाम हो, आदि) यह इस पूरे अभ्यास की उपयोगिता को गंभीर रूप से कम करेगा, क्योंकि कुछ लैम्ब्डा कार्यों में पर्यावरण पर कोई निर्भरता नहीं होगी।
संपादित करें 2:
मुझे एहसास हुआ कि यह के रूप में वे क्रम में मौजूद समारोह वस्तुओं की तुलना करने के लिए बहुत महत्वपूर्ण है। इसके बिना, बाहरी कार्यक्षेत्र से चर पर निर्भर सभी कार्यों की तुलना नहीं की जा सकती है; और सबसे उपयोगी कार्यों में ऐसी निर्भरताएं होती हैं। रनटाइम में माना जाता है, एक ही हस्ताक्षर वाले सभी कार्यों को एक साफ, तार्किक तरीके से तुलनात्मक रूप से तुलनात्मक रूप से तुलनात्मक रूप से तुलनात्मक रूप से तुलनात्मक, तार्किक तरीके से तुलनीय है, चाहे वे अशुद्ध हैं, आदि
नतीजतन, मुझे केवल बाइटकोड की आवश्यकता नहीं है बल्कि यह भी वैश्विक स्थिति उस समय के रूप में जब कार्य ऑब्जेक्ट बनाया गया था (संभवतः __globals__
)। फिर मुझे __globals__
से बाहरी दायरे से सभी चरों से मिलान करना होगा।
क्या आप जानते हैं, और क्या आपने इस तथ्य के लिए जिम्मेदार ठहराया है कि एक समारोह वस्तु का अर्थ क्या पर्यावरण के बंद होने के आधार पर भारी रूप से बदल सकता है? उदाहरण के लिए, 'lambda: 1/0 से बना दो फ़ंक्शन ऑब्जेक्ट्स यदि foo else 1' उनके व्यवहार में जंगली रूप से भिन्न हो जाएंगे यदि कोई' foo = True' पर बंद हो जाता है और दूसरा 'foo = False' पर बंद हो जाता है। और आइए अशुद्ध कार्यों और 'eval' के बारे में भी सोचें नहीं ... – delnan
@ डेलन धन्यवाद, मैंने इस बारे में नहीं सोचा था! मैं सवाल अपडेट कर रहा हूं। – max
अपनी वास्तविक समस्या को हल करने के लिए, आपको जो कुछ भी मांग रहे हैं उसकी आपको आवश्यकता नहीं है। आप सिर्फ देखभाल करते हैं कि दो लैम्बडा * क्रमबद्ध समकक्ष * हैं। आपका डेटा कैसा दिखता है? आप उन्हें सिर्फ एक नमूना खिला सकते हैं, लेकिन यह 100% विश्वसनीय नहीं है। मैं कहूंगा कि सबसे अच्छा समाधान (आपकी वास्तविक समस्या के लिए) एक बेहतर डिजाइन होगा। –