2016-01-07 5 views
6

एक साधारण उदाहरण के रूप में, एक उपयोगिता विधि है, जो एक अजगर वस्तु input_obj स्वीकार करता है, और out_type, एक अजगर type कन्वर्ट करने के लिए (समान किरदार)खोजें कि कौन सा अन्य अजगर प्रकार किसी वस्तु को परिवर्तित कर सकते हैं?

def convert_obj(input_obj,out_type): 

-Examples में वस्तु मान

convert_obj('2','int') 
#returns 2 
convert_obj([1,2,3],'tuple') 
#returns (1,2,3) 

विधि केवल विशिष्ट प्रकारों की वस्तुओं का समर्थन करती है जैसे str, list, tuple, और तब जांचता है कि क्या निर्दिष्ट आउटटाइप में परिवर्तित किया जा सकता है।

supported_conversions = { 
     tuple: [str, list, set], 
     str: [tuple, float, list, long, int, set], 
     float: [str, long, int], 
     list: [tuple, str, set], 
     long: [str, float, int], 
     dict: [tuple, str, list, set], 
     int: [str, float, long], 
     set: [tuple, str, list], 

    } 

supported_conversions में कुंजी input_obj के लिए अनुमति दी प्रकार हैं: इस विधि में नियम पुस्तिका मौजूद है।

प्रश्न: इसके अलावा कोशिश का उपयोग कर/सभी संभव अजगर प्रकार की एक सूची से अधिक को छोड़कर प्रत्येक प्रकार का एक नमूना वस्तु कन्वर्ट करने के लिए, और फिर देखने से क्या कर रहे हैं वैध, उदा [सूची, dict, tuple, int, tuple, set] के खिलाफ str रूपांतरण की जांच करना supported_conversions को अपनी चाबियाँ देने के लिए पाइथन में एक बेहतर तरीका है?

नोट: प्रकार रूपांतरण पर अन्य अपवाद को अनदेखा किया जाना चाहिए। उदाहरण के लिए "1" को पूर्णांक 1 में परिवर्तित किया जा सकता है, लेकिन "XYZ" नहीं हो सकता है। लेकिन यह अभी भी का अर्थ है str-> int एक वैध संभव रूपांतरण है।

+0

* "क्या पैनथन में एक समर्थित तरीका है, जो कि समर्थित कुंजीवर्क्स को उत्पन्न करने के लिए है?" * - यह बिल्कुल इस बात पर निर्भर करता है कि यह कार्य कैसे काम करता है! हम नहीं जानते कि इसके पीछे तर्क क्या है जो एक अभिसरण या दूसरे को अनुमति दे सकता है। – poke

+0

@poke मुख्य रूप से एक अजगर वस्तु का एक अन्य प्रकार में रूपांतरण टाइप करते हैं, जब यह ज्ञात होता है कि इसके डेटा के आधार पर यह सही ढंग से परिवर्तित हो जाएगा, लेकिन क्वेरी जानना है कि इसे किस प्रकार के संभावित रूप में परिवर्तित किया जा सकता है। – DhruvPathak

+2

लेकिन * प्रकार रूपांतरण कैसे काम करता है? मैं आसानी से * किसी भी * प्रकार * कुछ * में परिवर्तित करने के लिए आसानी से सोच सकता हूं। यह प्रकार रूपांतरण एल्गोरिदम है (यानी आपका 'convert_obj' फ़ंक्शन) जो पूरी तरह से निर्णय लेता है कि यह किस प्रकार के रूपांतरणों का समर्थन करता है। – poke

उत्तर

3

मुझे लगता है कि समस्या स्थान मौजूद होने के लिए पर्याप्त रूप से पर्याप्त परिभाषित नहीं है। कुछ रूपांतरण विनाशकारी होंगे, और कुछ एक से अधिक तरीकों से हो सकते हैं। कुछ उदाहरण:

>>> list(set([1,2,2,3])) 
[1, 2, 3] 
>>> list("hello") 
['h', 'e', 'l', 'l', 'o'] 
>>> ["hello"] 
['hello'] 
>>> list({'a':1, 'b': 2}) 
['a', 'b'] 
>>> list({'a':1, 'b': 2}.iteritems()) 
[('a', 1), ('b', 2)] 

तर्क के लिए, आप भी, मूल रूप से किसी भी अजगर प्रकार के लिए एक स्ट्रिंग में बदल सकते हैं eval() का उपयोग करके।

तो, मूल रूप से, यह सब आपके उपयोग के मामले पर निर्भर करता है।

यदि आप वास्तव में एक अधिक संपूर्ण खोज करना चाहते हैं, तो आप अंतर्निहित प्रकारों की सूची प्राप्त करने के लिए types मॉड्यूल का उपयोग कर सकते हैं, और फिर क्रॉस-कन्वर्ट करने का प्रयास कर सकते हैं (माना जाता है कि आप इनमें से प्रत्येक के उदाहरण प्राप्त कर सकते हैं):

>>> import types 
>>> [types.__dict__.get(t) for t in dir(types) if t.endswith('Type')] 
[<type 'bool'>, <type 'buffer'>, <type 'builtin_function_or_method'>, <type 'builtin_function_or_method'>, <type 'classobj'>, <type 'code'>, <type 'complex'>, <type 'dictproxy'>, <type 'dict'>, <type 'dict'>, <type 'ellipsis'>, <type 'file'>, <type 'float'>, <type 'frame'>, <type 'function'>, <type 'generator'>, <type 'getset_descriptor'>, <type 'instance'>, <type 'int'>, <type 'function'>, <type 'list'>, <type 'long'>, <type 'member_descriptor'>, <type 'instancemethod'>, <type 'module'>, <type 'NoneType'>, <type 'NotImplementedType'>, <type 'object'>, <type 'slice'>, <type 'str'>, <type 'traceback'>, <type 'tuple'>, <type 'type'>, <type 'instancemethod'>, <type 'unicode'>, <type 'xrange'>] 

मैं अगर आप पहले से अपने supported_conversions शब्दकोश उत्पन्न करने के लिए की जरूरत है, हालांकि पता नहीं है। मान लें कि आप हमेशा intype से outtypeouttype(intype_value) पर कनवर्ट करते हैं, तो आप इसका प्रयास कर सकते हैं और फिर (intype, outtype) -> bool पर एक डिक्शनरी अपडेट कर सकते हैं, और इसलिए यह पहली बार विफल होने पर फिर से रूपांतरण का प्रयास नहीं करेगा।

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