πλειάδες Διάσπαση στην Python - τις βέλτιστες πρακτικές;

ψήφοι
12

Έχω μια μέθοδο στον κώδικα Python μου που επιστρέφει μια πλειάδα - μια σειρά από SQL ερώτημα. Ας πούμε ότι έχει τρία πεδία: (jobID, ετικέτα, το όνομα χρήστη)

Για ευκολία περνούν γύρω από λειτουργίες, έχω περνούν όλο το πλειάδα ως μεταβλητή που ονομάζεται «δουλειά». Τελικά, όμως, θέλω να πάρω τα κομμάτια, έτσι έχω χρησιμοποιήσει κώδικα όπως αυτό: (jobID, ετικέτα, το όνομα χρήστη) = θέσεων εργασίας

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

Εδώ είναι δύο καλύτερες εκτιμήσεις μου: (jobID, ετικέτα, το όνομα χρήστη) = (εργασία [0], την εργασία [1], την εργασία [2]) ... αλλά αυτό δεν κλίμακα καλά όταν έχεις 15 ... 20 πεδία

ή να μετατρέψετε τα αποτελέσματα από το ερώτημα SQL σε ένα λεξικό αμέσως και να περάσει ότι περίπου (δεν έχω τον έλεγχο για το γεγονός ότι ξεκινά τη ζωή ως μια πλειάδα, αυτό είναι σταθερό για μένα)

Δημοσιεύθηκε 03/09/2008 στις 14:48
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
13

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

Για παράδειγμα:

job={}
job['jobid'], job['label'], job['username']=<querycode>
Απαντήθηκε 03/09/2008 στις 14:50
πηγή χρήστη

ψήφοι
0

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

Αν θέλετε κάτι με λίγο πιο φιλική σύνταξη ίσως να θέλετε να ρίξετε μια ματιά στις απαντήσεις ερώτημα αυτό για ένα απλό αντικείμενο «struct-όπως». Με αυτόν τον τρόπο μπορείτε να περάσετε γύρω από ένα αντικείμενο, ας πούμε job, και να έχετε πρόσβαση στους τομείς του ακόμα πιο εύκολα από ό, τι μια πλειάδα ή dict:

job.jobId, job.username = jobId, username
Απαντήθηκε 03/09/2008 στις 14:51
πηγή χρήστη

ψήφοι
3

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

Απαντήθηκε 03/09/2008 στις 14:57
πηγή χρήστη

ψήφοι
2

Θα χρησιμοποιήσετε ένα λεξικό. Μπορείτε να μετατρέψετε την πλειάδα σε ένα λεξικό με αυτόν τον τρόπο:

values = <querycode>
keys = ["jobid", "label", "username"]
job = dict([[keys[i], values [i]] for i in xrange(len(values ))])

Αυτό θα δημιουργήσει πρώτα μια σειρά [[ "jobID", VAL1], [ "ετικέτα", Val2], [ "όνομα χρήστη", val3]] και στη συνέχεια να μετατρέψετε ότι σε ένα λεξικό. Εάν η εντολή αποτέλεσμα ή να υπολογίζει τις αλλαγές, το μόνο που χρειάζεται να αλλάξετε τη λίστα των κλειδιών για να ταιριάζει με το νέο αποτέλεσμα.

PS ακόμη νωπές στη Python τον εαυτό μου, οπότε μπορεί να υπάρχουν καλύτεροι τρόποι από αυτόν τον τρόπο.

Απαντήθηκε 03/09/2008 στις 14:59
πηγή χρήστη

ψήφοι
-2

Τι λες για αυτό:

class TypedTuple:
    def __init__(self, fieldlist, items):
       self.fieldlist = fieldlist
       self.items = items
    def __getattr__(self, field):
       return self.items[self.fieldlist.index(field)]

Θα μπορούσε στη συνέχεια να κάνετε:

j = TypedTuple(["jobid", "label", "username"], job)
print j.jobid

Θα πρέπει να είναι εύκολο να ανταλλάξουν self.fieldlist.index(field)με ένα αναζήτηση λεξικό αργότερα ... απλά επεξεργαστείτε σας __init__μέθοδο! Κάτι σαν Staale κάνει.

Απαντήθηκε 03/09/2008 στις 15:02
πηγή χρήστη

ψήφοι
13

@Staale

Υπάρχει ένας καλύτερος τρόπος:

job = dict(zip(keys, values))
Απαντήθηκε 03/09/2008 στις 15:51
πηγή χρήστη

ψήφοι
2

Ένα παλιό θέμα, αλλά επειδή κανείς δεν το ανέφερα εγώ θα προσθέσω αυτό από την Python Cookbook:

Συνταγή 81252: Χρησιμοποιώντας dtuple για Ευέλικτη Ερώτημα πρόσβαση Αποτέλεσμα

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

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

ψήφοι
5

Αυτό είναι ένα παλιό θέμα, αλλά ...

Θα προτείνουμε να χρησιμοποιήσετε μια επώνυμη πλειάδα σε αυτή την κατάσταση: collections.namedtuple

Αυτό είναι το μέρος, μεταξύ άλλων, ότι θέλετε να βρείτε χρήσιμες:

Οι υποκλάσεις δεν είναι χρήσιμο για την προσθήκη νέων, αποθηκεύονται πεδία. Αντ 'αυτού, απλά να δημιουργήσετε ένα νέο που ονομάζεται τύπος πλειάδα από την ιδιότητα _fields.

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

ψήφοι
0

Αν χρησιμοποιείτε το πακέτο MySQLdb, μπορείτε να ρυθμίσετε το δρομέα αντικείμενα για να επιστρέψετε DICTS αντί πλειάδες.

import MySQLdb, MySQLdb.cursors
conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.DictCursor)
cur = conn.cursor() # a DictCursor
cur2 = conn.cursor(cursorclass=MySQLdb.cursors.Cursor) # a "normal" tuple cursor
Απαντήθηκε 09/04/2010 στις 17:28
πηγή χρήστη

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