2016-02-09 7 views
8

एक मूर्ख सवाल, लेकिन यह मुझे परेशान कर रहा है (मेरी अयोग्यता के लिए डाउनवॉट्स के बावजूद!): मुझे लगता है कि मैंने विधि के बाहर डेटा उत्पन्न करने का एक बकवास डर उठाया है (बदले बिना), लेकिन अगर यह मामला है तो मुझे यकीन नहीं है।विधि के बाहर डेटा उत्पन्न करने का पाइथोनिक तरीका

मान लें कि मेरे पास myfx विधि है, जिसके लिए कुछ शब्दकोश datadex की आवश्यकता होगी जिसके लिए एक लंबा ऑपरेशन करना आवश्यक है, लेकिन उस सत्र के दौरान सभी कॉलों के लिए आम बात होगी। सबसे सरल, लेकिन करने योग्य नहीं, तरीका है:

def myfx(x,foo): 
    datadex={f:42 for f in foo} #initialise 
    mungeddata=datadex[x]+1 #munge 
    return mungeddata 

लेकिन यह बहुत अधिक समय बर्बाद कर देगा। तो सबसे अच्छी बात मुख्य दायरे में यह एक बार बनाने के लिए किया जाएगा के रूप में एक वर्ग चर के साथ कार्य करता है:

datadex={f:42 for f in foo} #initialise 
def myfx(x): 
    mungeddata=datadex[x]+1 #munge 
    return mungeddata 

हालांकि, मैं पता नहीं क्यों, लेकिन मैं इस से बचने के लिए हद तक चले जाते हैं। यह सुरुचिपूर्ण है, लेकिन मुझे नहीं लगता कि यह मामला है। मैं आमतौर पर बंद करने का सहारा लेता हूं:

def initialise(foo): 
    datadex={f:42 for f in foo} #initialise 
    def myfx(x): 
     mungeddata=datadex[x]+1 #munge 
     return mungeddata 
    return myfx 

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

+0

'मुझे नहीं पता क्यों, लेकिन मैं इससे बचने के लिए बहुत अधिक समय तक जाता हूं। यह सुरुचिपूर्ण है, लेकिन मुझे नहीं लगता कि यह मामला है - आप प्रतीत होता है कि आप कार्यात्मक प्रोग्रामिंग के बारे में सोच रहे हैं, जहां (अन्य चीजों के साथ) – Izkata

+0

परिभाषित किए जाने के बाद वैरिएबल को बदला नहीं जा सकता है (ए) आपका प्रश्न वास्तव में क्या है? (बी) क्या आपने कामों के तर्क के रूप में बस 'डेटाडेक्स' को पारित नहीं माना है (मुझे यहां कोई तरीका नहीं दिख रहा है) जो इसका उपयोग करते हैं? – jwodder

+3

हाँ, वह 'प्रारंभिक विधि' मूल रूप से आंशिक फ़ंक्शन एप्लिकेशन कर रही है। [Functools] (https://docs.python.org/3/library/functools.html) में [आंशिक] (https://docs.python.org/3/library/functools) नामक एक सहायक है। एचटीएमएल # functools.partial) – dtanders

उत्तर

6

एक वर्ग इस व्यवहार को समाहित करने का सही तरीका है। आपके पास कुछ डेटा है जो एकाधिक फ़ंक्शन कॉल द्वारा साझा किया जाता है।

class MungedData(object): 

    def __init__(self, foo): 
     self.datadex = {f:42 for f in foo} 

    def myfx(self, x): 
     return self.datadex[x] + 1 

md = MungedData(somefoo) 
print(md.myfx(arg1)) 
print(md.myfx(arg2)) 

हालांकि निश्चित रूप से अन्य विकल्प हैं, यह पायथन में सबसे आम और सरल विधि होने जा रहा है।

2

अजगर कार्यों वस्तुओं रहे हैं और विशेषताओं हो सकता है, यदि आप नहीं करते हैं एक क्लास के भीतर अपने कार्य के लिए आप कुछ इस तरह कर सकते हैं चाहते हैं:

def myfx(x): 
    mungeddata=myfx.datadex[x]+1 #munge 
    return mungeddata 
myfx.datadex={f:42 for f in foo} #initialise 

मुझे लगता है वह यह है कि क्या आप से बचने के लिए कोशिश कर रहे हैं एक वैश्विक चर है।

+2

मेरे लिए यह "ओओ के एक हैकी फॉर्म" का उपयोग करके समस्या को हल करने की कोशिश की तरह दिखता है क्योंकि @ ब्रेन्डन हाबेल ने इसे उपरोक्त टिप्पणियों में बुलाया था। यह समझ में आता है जब उचित ओओ उपलब्ध नहीं है, जैसे जेएस में, लेकिन पाइथन में खुद को क्यों सीमित करें? – Nico

+0

तथ्य यह है कि फ़ंक्शंस विशेषताएं ले सकता है, इसका लाभ उठाने के लिए पाइथन को कैसे बनाया गया है, इसके बारे में एक दुर्घटना का अधिक है। मुझे यकीन नहीं है कि मैंने कभी इसे इस्तेमाल किया है। – chepner

+0

@ निको जेएस में "उचित ओओ" नहीं है? मुझे नहीं पता था, मैंने जो कुछ भी पढ़ा है वह गलत होना चाहिए। पायथन multiparadigm है, यह डेवलपर्स पर किसी भी शैली को मजबूर नहीं करता है, और मुफ्त कार्यों में कुछ भी गलत नहीं है। – imreal

0

यदि आप वास्तव में केवल ऑब्जेक्ट उन्मुख प्रोग्रामिंग से बचना चाहते हैं तो आप एक नक्शा बनाने के लिए निम्नलिखित कार्य कर सकते हैं जहां get_dict() dict को संग्रहीत करने के लिए जनरेटर का उपयोग करता है।

def get_dict(): 
    d = {f:42 for f in foo} 
    while True: 
    yield d 

def myfx(x): 
    datadex = get_dict() 
    return datadex[x]+1 #munge 

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

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