अमूर्त मौसम / शो / एपिसोड डेटा का सबसे अच्छा तरीका

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

यह अनुरोध के अनुसार एपीआई से डेटा पकड़ता है, और किसी भी तरह से डेटा स्टोर करना है, और इसे करने के द्वारा इसे उपलब्ध कराया गया है:

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

Tvdb() कक्षा के भीतर इस डेटा को अमूर्त करने का "सर्वोत्तम" तरीका क्या है?

मैंने मूल रूप से एक विस्तारित <�कोड> डिक्ट() का उपयोग किया जो स्वचालित रूप से उप-डिस्केट बनाया गया था (ताकि आप x [1] [2] [3] [4] = "कुछ" कर सकें बिना <�कोड> करने के लिए x = 1] .has_key (2): x [1] [2] = [] और इसी तरह)

Then I just stored the data by doing self.data[show_id][season_number][episode_number][attribute_name] = "something"

यह ठीक काम करता है, लेकिन जांचने का कोई आसान तरीका नहीं था कि x [3] [24] मौजूद होना चाहिए या नहीं (इसलिए मैं season_not_found अपवाद नहीं बढ़ा सकता)।

वर्तमान में यह चार वर्गों का उपयोग कर रहा है: ShowContainer , दिखाएँ , सीजन और एपिसोड । प्रत्येक एक बहुत ही बुनियादी नियम है, जिसे मैं आसानी से खोज() फ़ंक्शन में खोज() फ़ंक्शन में अतिरिक्त कार्यक्षमता जोड़ सकता हूं)। प्रत्येक में __ setitem __ , __ getitem _ और has_key है।

यह अधिकतर ठीक काम करता है, अगर मैं उस सत्र में self.data </​​code> dict में हूं, तो नहीं, season_not_found बढ़ाएं। मैं सीजन() में भी देख सकता हूं यदि उसके पास यह एपिसोड है और इसी तरह।

समस्या यह है कि यह खुद को एक ताना के रूप में पेश कर रहा है, लेकिन इसमें सभी कार्यक्षमताएं नहीं हैं, और क्योंकि मैं __ getitem __ और __ setitem __ फ़ंक्शंस को ओवरराइड कर रहा हूं, गलती से करना आसान है दोबारा कॉल करें __ getitem __ (इसलिए मुझे यकीन नहीं है कि डिक्ट कक्षा को विस्तारित करने से समस्याएं उत्पन्न होंगी)।

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

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

0
ro fr bn

5 उत्तर

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

NOTE: I'm not a Python guy so I don't know what your xml support is like.

NOTE 2: You'll want to profile this because it'll be bigger and slower than the solution you've already got. Likely enough if you are doing some high-volume processing then xml is probably not going to be your friend.

0
जोड़ा

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

x['some show'][3][24] would return season 3, episode 24 of "some show". If there was no season 3, I want the pseudo-dict to raise tvdb_seasonnotfound, if "some show" doesn't exist, then raise tvdb_shownotfound

कक्षाओं की एक श्रृंखला की वर्तमान प्रणाली, प्रत्येक __ getitem __ के साथ - चेक दिखाएं अगर self.seasons.has_key (request_season_number) , सीजन क्लास चेक <�कोड> यदि स्वयं है। episodes.has_key (request_episode_number) और इसी तरह।

यह काम करता है, लेकिन ऐसा लगता है कि बहुत बार दोहराया गया कोड (प्रत्येक वर्ग मूल रूप से वही है, लेकिन एक अलग त्रुटि उठाता है)

0
जोड़ा

मुझे यह हिस्सा यहां नहीं मिला है:

यह ठीक काम करता है, लेकिन यह जांचने का कोई आसान तरीका नहीं था कि x [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
जोड़ा

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

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

यह आपको देता है:

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

याद रखें कि आप हमेशा कक्षा का नाम प्राप्त कर सकते हैं:

self.__class__.__name__

तो, कुछ स्ट्रिंग मैंगलिंग और कॉन्सटेनेशन के बाद, आपको उपयुक्त अपवाद वर्ग का नाम प्राप्त करने और उस नाम का उपयोग करके क्लास ऑब्जेक्ट बनाने में सक्षम होना चाहिए और फिर उस अपवाद को बढ़ाएं।

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

raise(self.__class__.__name__+"Exception")
0
जोड़ा

Why not use SQLite? There is good support in Python and you can write SQL queries to get the data out. Here is the Python docs for sqlite3


यदि आप SQLite का उपयोग नहीं करना चाहते हैं तो आप डिक्ट्स की एक सरणी कर सकते हैं।

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
जोड़ा