2016-10-20 6 views
7

मुझे एक मॉड्यूल & कक्षा को एक शब्दकोश कुंजी में असाइन करने की आवश्यकता है। फिर फ़ाइल को पिकल करें। फिर बाद में, पीकेएल फ़ाइल लोड करें, फिर & उस कुंजीपटल कुंजी मान के आधार पर कक्षा को तुरंत चालू करें।मैं मॉड्यूल और कक्षा वाले शब्दकोश को कैसे उठा सकता हूं?

मैं इस की कोशिश की है:

import module_example 
from module_example import ClassExample 

dictionary = {'module': module_example, 'class': ClassExample) 

अभी तक यह pkl फ़ाइल में module_exmaple.py के लिए एक संदर्भ संग्रहीत नहीं करेगा।

मैंने मॉड्यूल & कक्षा नाम के बजाय स्ट्रिंग का उपयोग करने का कामकाज करने का प्रयास किया है। लेकिन अगर मॉड्यूल का नाम दोबारा शुरू हो जाता है या सड़क के नीचे स्थान बदल जाता है तो यह एक गड़बड़ी का कारण बन जाएगा।

क्या वैसे भी यह सीधे है? किसी भी तरह एक शब्दकोश में मॉड्यूल & कक्षा के संदर्भ को संग्रहीत करते हैं, फिर बाद में उस संदर्भ के आधार पर & तत्काल आयात करें?

उत्तर

2

यह एकल वर्ग के लिए काम करता है। यदि आप इसे कई मॉड्यूल और कक्षाओं में करना चाहते हैं, तो आप निम्न कोड का विस्तार कर सकते हैं।

module_class_writer.py

import module_example 
from module_example import ClassExample 

included_module = ["module_example"] 
d = {} 
for name, val in globals().items(): 
    if name in included_module: 
     if "__module__" in dir(val): 
      d["module"] = val.__module__ 
      d["class"] = name 

#d = {'module': module_example, 'class': ClassExample} 

import pickle 
filehandler = open("imports.pkl","wb") 
pickle.dump(d, filehandler) 
filehandler.close() 

module_class_reader.py

import pickle 
filehandler = open("imports.pkl",'rb') 
d = pickle.load(filehandler) 
filehandler.close() 

def reload_class(module_name, class_name): 
    mod = __import__(module_name, fromlist=[class_name]) 
    reload(mod) 
    return getattr(mod, class_name) 

if "class" in d and "module" in d: 
    reload(__import__(d["module"])) 
    ClassExample = reload_class(d["module"], d["class"]) 
0

यदि आप अनचाहे वर्ग को वही ऑब्जेक्ट होना चाहते हैं जो मसालेदार था, तो आपको कक्षा के कोड को स्टोर करना होगा (उदाहरण के लिए dill जैसी बाहरी लाइब्रेरी का उपयोग करना)।

अन्यथा, मानक अचार के साथ एक वर्ग को संदर्भित करने के लिए कोई रास्ता नहीं है जो एक रिफैक्टरिंग 'जीवित' रहेगा।

+0

मैं टी एक ही वस्तु की जरूरत है डॉन। लेकिन मुझे कक्षा के संदर्भ की आवश्यकता है। ताकि मैं उस संदर्भ के आधार पर एक नई वस्तु को तुरंत चालू कर सकूं। यदि उस वर्ग का नाम एंडर स्थान दोबारा किया गया है, तो मैं संदर्भ को भी प्रतिबिंबित करना चाहता हूं। किसी भी तरह से किया जा सकता है? – Emily

+0

@Emily: ऐसा कोई तरीका नहीं है कि पाइथन यह बताने में सक्षम होगा कि इस तरह के एक रिफैक्टरिंग के बाद नई कक्षा और पुरानी कक्षा "एक ही कक्षा" है। – user2357112

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