5

मैंने यादृच्छिक नेटवर्क के विभिन्न सांख्यिकीय विश्लेषण करने वाले कुछ महंगे कार्यों को लगातार याद रखने के लिए एक छोटी कक्षा लिखी है।पायथन: फ़ंक्शन तर्कों के साथ लगातार याद रखने वाले कार्यों के लिए रणनीतियों?

ये सभी शुद्ध कार्य हैं; सभी डेटा अपरिवर्तनीय है। हालांकि, कुछ कार्य तर्कों के रूप में कार्य करते हैं।

बनाना इन तर्कों के आधार पर कुंजी एक छोटी सी समस्या, समारोह वस्तु समानता समारोह वस्तु पहचान है, जो सत्र के बीच मौजूद नहीं होता है, भले ही समारोह कार्यान्वयन परिवर्तन नहीं करता है के बराबर है है पायथन में के बाद से।

मैं इस के आसपास समय स्ट्रिंग के रूप समारोह नाम का उपयोग करके किया जा रहा है के लिए हैकिंग कर रहा हूँ, लेकिन जब एक समारोह या अनाम कार्यों और इतने पर के कार्यान्वयन को बदलने के बारे में सोच शुरू होता है इस मुद्दों के अपने स्वयं के झुंड को जन्म देती है। लेकिन मैं शायद ऐसी चीजों के बारे में चिंता करने वाले पहले व्यक्ति नहीं हूं।

क्या किसी के पास पाइथन में फ़ंक्शन तर्कों के साथ लगातार कार्यों को याद रखने के लिए कोई रणनीतियां हैं?

+0

[अजगर में लगातार Memoization] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/9320463/persistent-memoization-in-python) –

+2

@DanatheSane कि एक नकली नहीं है --- यह लगातार Memoization चर्चा नहीं करता आमंत्रणों के बीच जहां कार्यों को ज्ञापन समारोह के लिए तर्क हैं। – tobyodavies

उत्तर

2

समारोह

[getattr(func.__code__,s) 
for s in ['co_argcount', 'co_cellvars', 'co_code', 'co_consts', 
      'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 
      'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 
      'co_varnames'] 
] 

कि सही ढंग से किसी भी तरह से कार्यान्वयन को बदलने संभाल चाहिए की पहचान के रूप में इस का उपयोग कर पर एक नज़र डालें ...

+0

धन्यवाद। मुझे लगता है कि 'co_names' में ज्ञापन कार्यों पर इस पुनरावर्तन की तरह कुछ ऐसा करना चाहिए। मैं खुशी से हैरान था कि 'प्रारंभिक परीक्षण' में विभिन्न प्लेटफार्मों और पायथन संस्करणों के कई अलग-अलग हिस्सों में 'co_code' समान था। मुझे लगता है मुझे पाइथन वर्चुअल मशीन पर पढ़ने की जरूरत है। –

+0

सामान्य कॉल करने योग्य वस्तुओं के लिए कुछ समान काम करेगा? वैश्विक नामों जैसी अशुद्धियों से परहेज करते समय ठीक है, किसी फ़ंक्शन के अलावा किसी भी कॉल करने योग्य के उपयोग को प्रतिबंधित करना अवांछनीय होगा यदि इसकी सहायता की जा सके। – max

+0

@ मैक्स नंबर, यह नहीं होगा। सामान्य रूप से ऐसा करना असंभव होगा क्योंकि सामान्य कॉल करने योग्य के कार्यान्वयन में परिवर्तन का गठन उस कॉल करने योग्य वर्ग के वर्ग द्वारा किया जाता है। निकटतम आप उम्मीद कर सकते हैं कि वर्ग पिकलेबल या मार्शलबल है जैसे कि कार्यान्वयन परिवर्तनों के बीच प्रतिनिधित्व समान नहीं हैं। वैकल्पिक रूप से आप कॉल करने योग्य के कार्यान्वयन के संस्करण को निर्धारित करने के लिए अपना स्वयं का प्रोटोकॉल प्राप्त कर सकते हैं। – tobyodavies

3

एक विकल्प का उपयोग करने के होगा marshal.dumps(function.func_code)

यह फ़ंक्शन के कोड के लिए स्ट्रिंग प्रस्तुति का उत्पादन करेगा। इसे बदलते कार्यान्वयन और अज्ञात कार्यों को संभालना चाहिए।

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