2008-08-08 35 views
13

असल में, मैंने पायथन में www.thetvdb.com पर एक एपीआई लिखा है। वर्तमान कोड here पाया जा सकता है।अमूर्त मौसम/शो/एपिसोड डेटा का सर्वोत्तम तरीका

यह एपीआई से डेटा पकड़ लेता है के रूप में अनुरोध किया है, और ऐसा करने से किसी भी तरह डाटा स्टोर, और यह उपलब्ध बनाने के लिए है:

print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1 

क्या है "सर्वश्रेष्ठ" Tvdb() वर्ग के भीतर सार इस डेटा के लिए रास्ता ?

मैं मूल रूप से एक विस्तारित Dict() कि स्वचालित रूप से उप dicts बनाई इस्तेमाल किया

तब मैं सिर्फ self.data[show_id][season_number][episode_number][attribute_name] = "something"

कर यह काम किया द्वारा डाटा संग्रहित (ताकि आप x[1][2][3][4] = "something" कर सकता है if x[1].has_key(2): x[1][2] = [] करने के लिए और इतने पर बिना) ठीक है, लेकिन जांचने का कोई आसान तरीका नहीं था कि x[3][24] मौजूद होना चाहिए या नहीं (इसलिए मैं season_not_found अपवाद नहीं बढ़ा सकता)। ShowContainer, Show, Season और Episode:

वर्तमान में यह चार वर्गों उपयोग कर रहा है। प्रत्येक एक बहुत ही बुनियादी नियम है, जिसे मैं आसानी से अतिरिक्त कार्यक्षमता जोड़ सकता हूं (उदाहरण के लिए Show() पर search() फ़ंक्शन)। प्रत्येक में __setitem__, __getitem_ और has_key है।

यह अधिकतर ठीक काम करता है, यदि यह उस मौसम में self.data dict में है, तो raise season_not_found में यह मौसम दिखा सकता है। मैं Season() में भी देख सकता हूं यदि उसके पास यह एपिसोड है और इसी तरह।

समस्या अब यह एक dict रूप में खुद को प्रस्तुत करने वाला है, लेकिन सभी सुविधा उपलब्ध नहीं है, और क्योंकि मैं __getitem__ और __setitem__ कार्यों अधिभावी कर रहा हूँ, यह गलती से रिकर्सिवली कॉल करने के लिए __getitem__ (तो मैं यकीन नहीं है आसान है यदि Dict कक्षा का विस्तार करने से समस्याएं पैदा होंगी)।

अन्य मामूली समस्या dict में डेटा जोड़ रहा है वर्ष Dict विधि (जो self.data[seas_no][ep_no]['attribute'] = 'something' था) की तुलना में बहुत अधिक काम है। _setItem और _setData देखें। यह बहुत बुरा नहीं है, क्योंकि वर्तमान में यह केवल पढ़ने-योग्य एपीआई इंटरफ़ेस है (इसलिए एपीआई के उपयोगकर्ताओं को केवल डेटा पुनर्प्राप्त करना चाहिए, अधिक नहीं जोड़ना चाहिए), लेकिन यह शायद ही कभी ... सुरुचिपूर्ण है।

मुझे लगता है कि सीरीज़-ऑफ-क्लास सिस्टम शायद सबसे अच्छा तरीका है, लेकिन क्या किसी के पास डेटा संग्रह करने के लिए बेहतर विचार है? और Dict के साथ ShowContainer/आदि कक्षाओं का विस्तार करेगा?

उत्तर

5

ठीक है, तुम क्या जरूरत है नए मॉड्यूल से classobj है। इससे आपको गतिशील रूप से अपवाद वर्गों का निर्माण करने की अनुमति मिल जाएगी (classobj वर्ग नाम के लिए एक तर्क के रूप में एक स्ट्रिंग लेता है)।

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
__main__.ExcName: This is the exc msg! 

याद है कि आप हमेशा वर्ग के नाम के माध्यम से प्राप्त कर सकते हैं:

self.__class__.__name__ 

तो, कुछ स्ट्रिंग mangling और संयोजन, आप में सक्षम होना चाहिए के बाद

import new 
myexc=new.classobj("ExcName",(Exception,),{}) 
i=myexc("This is the exc msg!") 
raise i 

यह आप देता है उपयुक्त अपवाद वर्ग का नाम प्राप्त करें और उस नाम का उपयोग करके कक्षा वस्तु का निर्माण करें और फिर उस अपवाद को उठाएं।

पीएस- आप स्ट्रिंग भी बढ़ा सकते हैं, लेकिन यह बहिष्कृत है।

raise(self.__class__.__name__+"Exception") 
3

SQLite का उपयोग क्यों नहीं करें? पायथन में अच्छा समर्थन है और आप डेटा प्राप्त करने के लिए एसक्यूएल प्रश्न लिख सकते हैं। यहाँ के लिए sqlite3


अजगर डॉक्स आप SQLite उपयोग करने के लिए आप dicts की एक सरणी कर सकता है नहीं करना चाहते हैं है।

episodes = [] 
episodes.append({'season':1, 'episode': 2, 'name':'Something'}) 
episodes.append({'season':1, 'episode': 2, 'name':'Something', 'actors':['Billy Bob', 'Sean Penn']}) 

इस तरह आप बहुत आसानी से

season_1 = [e for e in episodes if e['season'] == 1] 
billy_bob = [e for e in episodes if 'actors' in e and 'Billy Bob' in e['actors']] 

for episode in billy_bob: 
    print "Billy bob was in Season %s Episode %s" % (episode['season'], episode['episode']) 
0

मैंने पहले भी कुछ इसी तरह किया जाता है और एक त्वरित और गंदा hierachical डेटाबेस के रूप में एक में स्मृति XML दस्तावेज का इस्तेमाल किया है यह खोज किसी भी रिकॉर्ड करने के लिए मेटाडेटा जोड़ सकते हैं और भंडारण के लिए। आप तत्वों पर एक्सएमएल विशेषताओं के रूप में प्रत्येक शो/सीजन/एपिसोड को तत्व (नेस्टेड उचित तरीके से) और इन चीजों के गुणों के रूप में स्टोर कर सकते हैं। फिर आप जानकारी प्राप्त करने के लिए XQuery का उपयोग कर सकते हैं।

नोट: मैं पाइथन लड़का नहीं हूं इसलिए मुझे नहीं पता कि आपका एक्सएमएल समर्थन कैसा है।

नोट 2: आप इसे प्रोफाइल करना चाहते हैं क्योंकि यह आपके द्वारा पहले से प्राप्त समाधान से बड़ा और धीमा होगा। यदि आप कुछ उच्च-मात्रा प्रोसेसिंग कर रहे हैं तो संभवतः पर्याप्त है तो एक्सएमएल शायद आपका मित्र नहीं होगा।

0

मैं इस हिस्से यहाँ नहीं मिलता:

यह ठीक काम किया है, लेकिन वहाँ जाँच अगर एक्स [3] [24] अस्तित्व के लिए या होना चाहिए था नहीं की कोई आसान तरीका था (तो मैं नहीं कर सके ' टी season_not_found अपवाद बढ़ा)

यह करने के लिए एक तरीका होता है - में कहा जाता है:

>>>x={} 
>>>x[1]={} 
>>>x[1][2]={} 
>>>x 
{1: {2: {}}} 
>>> 2 in x[1] 
True 
>>> 3 in x[1] 
False 

क्या समस्या लगती है उस के साथ?

0

बार्तोज़/स्पष्ट करने के लिए "यह ठीक काम किया है, लेकिन वहाँ जाँच अगर एक्स [3] [24] मौजूद हैं या नहीं करने वाला था की कोई आसान तरीका था" की

x['some show'][3][24] सीजन 3 वापसी होगी, प्रकरण 24 " कुछ शो "। अगर कोई सीजन 3 था, मैं छद्म dict tvdb_seasonnotfound बढ़ाने के लिए चाहते हैं, यदि "कुछ शो" मौजूद नहीं है, तो tvdb_shownotfound

वर्गों की एक श्रृंखला की वर्तमान प्रणाली, एक __getitem__ के साथ प्रत्येक बढ़ा - चेकों दिखाएँ if self.seasons.has_key(requested_season_number), सीजन क्लास if self.episodes.has_key(requested_episode_number) और इसी तरह की जांच करता है।

यह काम करता है, लेकिन यह वहाँ दोहराया कोड का एक बहुत कुछ हो रहा है (प्रत्येक वर्ग मूलतः एक ही है, लेकिन एक अलग त्रुटि को जन्म देती है)

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