Ο καλύτερος τρόπος για να αφηρημένη σεζόν / show / δεδομένων επεισοδίου

ψήφοι
13

Βασικά, έχω γράψει ένα API για www.thetvdb.com στην Python. Ο ισχύων κώδικας μπορεί να βρεθεί εδώ .

Το αρπάζει δεδομένα από το API όπως ζητήθηκε, και πρέπει να αποθηκεύσετε τα δεδομένα με κάποιο τρόπο, και τη διάθεσή του από τον τρόπο:

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

Ποιος είναι ο τρόπος με τον «καλύτερο» για την αφηρημένη αυτά τα δεδομένα, κατά την Tvdb()τάξη;

Θα χρησιμοποιηθεί αρχικά επεκτάθηκε Dict()ώστε αυτόματα δημιουργούνται υπο-DICTS (ώστε να μπορείτε να το κάνετε x[1][2][3][4] = somethingχωρίς να χρειάζεται να κάνει if x[1].has_key(2): x[1][2] = []και ούτω καθεξής)

Τότε ακριβώς αποθηκεύονται τα δεδομένα με τον τρόπο self.data[show_id][season_number][episode_number][attribute_name] = something

Αυτό λειτούργησε καλά, αλλά δεν υπήρχε εύκολος τρόπος για να ελέγξετε αν x[3][24]έπρεπε να υπάρχει ή όχι (γι 'αυτό δεν θα μπορούσε να αυξήσει την εξαίρεση season_not_found).

Αυτή τη στιγμή είναι χρησιμοποιώντας τέσσερις κατηγορίες: ShowContainer, Show, Seasonκαι Episode. Κάθε ένα είναι μια πολύ βασική dict, η οποία εύκολα μπορώ να προσθέσουν επιπλέον λειτουργικότητα στο (τη search()λειτουργία σχετικά με Show(), για παράδειγμα). Καθένα από αυτά έχει μια __setitem__, __getitem_και has_key.

Αυτό λειτουργεί ως επί το πλείστον καλά, μπορώ να ελέγξω το Δείχνει αν έχει εκείνη την εποχή σε αυτό το self.datadict, αν όχι, raise season_not_found. Μπορώ επίσης να ελέγξετε το Season()αν έχει αυτό το επεισόδιο και ούτω καθεξής.

Το πρόβλημα τώρα είναι ότι είναι παρουσιάζοντας τον εαυτό του ως ένα dict, αλλά δεν έχει όλες τις λειτουργίες, και επειδή είμαι ακύρωση των __getitem__και __setitem__λειτουργίες, είναι εύκολο να καλέσετε λάθος αναδρομικά __getitem__(έτσι δεν είμαι σίγουρος αν την επέκταση της Dictτάξης θα προκαλέσει προβλήματα ).

Το άλλο μικρό πρόβλημα είναι η προσθήκη δεδομένων στο dict είναι πολύ περισσότερη εργασία από την παλαιά Dictμέθοδο (η οποία ήταν self.data[seas_no][ep_no]['attribute'] = 'something'). Δείτε _setItemκαι _setData. Δεν είναι πάρα πολύ κακό, δεδομένου ότι είναι προς το παρόν μόνο μια διεπαφή API μόνο για ανάγνωση (έτσι ώστε οι χρήστες του API θα πρέπει να ανακτήσετε μόνο ποτέ δεδομένα, δεν προσθέτουν περισσότερο), αλλά είναι σχεδόν ... Elegant.

Νομίζω ότι το σύστημα σειρά-του-μαθήματα είναι ίσως ο καλύτερος τρόπος, αλλά όμως κάποιοι έχουν μια καλύτερη ιδέα για την αποθήκευση των δεδομένων; Και θα επεκτείνει τις ShowContainer/ etc τάξεις με Dictπροβλήματα προκαλούν;

Δημοσιεύθηκε 08/08/2008 στις 15:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
3

Γιατί να μην χρησιμοποιήσετε SQLite; Υπάρχει καλή υποστήριξη σε Python και μπορείτε να γράψετε ερωτήματα SQL για να πάρετε τα δεδομένα έξω. Εδώ είναι τα έγγραφα Python για 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'])
Απαντήθηκε 08/08/2008 στις 17:45
πηγή χρήστη

ψήφοι
0

Έχω κάνει κάτι παρόμοιο στο παρελθόν και χρησιμοποίησε ένα έγγραφο XML στη μνήμη σαν μια γρήγορη και βρώμικη ιεραρχική βάση δεδομένων για την αποθήκευση. Μπορείτε να αποθηκεύσετε κάθε παράσταση / σεζόν / επεισόδιο ως ένα στοιχείο (ένθετα κατάλληλα) και τα χαρακτηριστικά του αυτά τα πράγματα, όπως χαρακτηριστικά xml για τα στοιχεία. Στη συνέχεια, μπορείτε να χρησιμοποιήσετε XQuery για να πάρετε πληροφορίες πίσω.

ΣΗΜΕΙΩΣΗ: Δεν είμαι ένας τύπος Python, έτσι δεν ξέρω τι υποστήριξη xml σας είναι παρόμοια.

ΣΗΜΕΙΩΣΗ 2: Θα ήθελα στο προφίλ αυτό γιατί θα είναι μεγαλύτερο και πιο αργή από ό, τι η λύση που έχετε ήδη έχεις. Πιθανή αρκετά αν κάνετε κάποια επεξεργασία μεγάλου όγκου τότε XML είναι κατά πάσα πιθανότητα δεν πρόκειται να γίνει φίλος σας.

Απαντήθηκε 09/08/2008 στις 16:13
πηγή χρήστη

ψήφοι
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

ό, τι φαίνεται να είναι το πρόβλημα με αυτό;

Απαντήθηκε 11/08/2008 στις 21:07
πηγή χρήστη

ψήφοι
0

Bartosz / να διευκρινίσει «Αυτό λειτούργησε καλά, αλλά δεν υπήρχε εύκολος τρόπος για να ελέγξετε αν x [3] [24] έπρεπε να υπάρχει ή όχι»

x['some show'][3][24]Θα επιστρέψει σεζόν 3, επεισόδιο 24 «κάποιο show». Αν δεν υπήρχε σεζόν 3, θέλω το ψευδο-dict να αυξήσει tvdb_seasonnotfound, αν δεν υπάρχει «κάποια παράσταση», στη συνέχεια, να αυξήσει tvdb_shownotfound

Το ισχύον σύστημα μια σειρά από μαθήματα, το καθένα με ένα __getitem__- Δείτε ελέγχους if self.seasons.has_key(requested_season_number), τους ελέγχους σεζόν τάξης if self.episodes.has_key(requested_episode_number)και ούτω καθεξής.

Λειτουργεί, αλλά φαίνεται να είναι πολύ επαναλαμβανόμενων κώδικα υπάρχει (κάθε τάξη είναι βασικά η ίδια, αλλά δημιουργεί ένα διαφορετικό σφάλμα)

Απαντήθηκε 12/08/2008 στις 18:55
πηγή χρήστη

ψήφοι
5

Εντάξει, αυτό που χρειάζεστε είναι classobjαπό την νέα μονάδα. Αυτό θα σας επιτρέψει να κατασκευάσει κατηγορίες εξαίρεση δυναμικά ( classobjπαίρνει ένα string ως επιχείρημα για το όνομα της κλάσης).

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

Αυτό σας δίνει:

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

να θυμάστε ότι μπορείτε να πάρετε πάντα το όνομα της κλάσης μέσω:

self.__class__.__name__

Έτσι, μετά από κάποια κατακρεούργηση εγχόρδων και συνένωση, θα πρέπει να είναι σε θέση να λάβουν τα κατάλληλα το όνομα της κλάσης, εκτός και να κατασκευάσει ένα αντικείμενο κλάσης χρησιμοποιώντας αυτό το όνομα και στη συνέχεια να αυξήσει την εξαίρεση αυτή.

PS - μπορείτε επίσης να αυξήσει χορδές, αλλά αυτό έχει καταργηθεί.

raise(self.__class__.__name__+"Exception")
Απαντήθηκε 14/08/2008 στις 08:08
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more