Splitting tupler i Python - beste praksis?

stemmer
12

Jeg har en metode i min Python kode som returnerer et tuppel - en rad fra en SQL-spørring. La oss si at den har tre felt: (jobid, etikett, brukernavn)

For enkel passerer det rundt mellom funksjoner, har jeg vært passerer hele tuppel som en variabel som heter 'jobb'. Til slutt, men jeg ønsker å få på biter, så jeg har brukt kode som dette: (jobid, etikett, brukernavn) = jobb

Jeg har innsett, men at dette er en vedlikehold mareritt, fordi nå kan jeg aldri legge til nye felt i resultatsettet uten å bryte alle mine eksisterende kode. Hvordan bør jeg ha skrevet dette?

Her er mine to beste gjetninger: (jobid, etikett, brukernavn) = (jobb [0], jobb [1], jobb [2]) ... men det betyr ikke skalerer pent når du har 15 ... 20 felt

eller å konvertere resultatene fra SQL-spørring til en ordbok med en gang og pass på at rundt (jeg har ikke kontroll over det faktum at den starter livet som en tuppel, som er fast for meg)

Publisert på 03/09/2008 klokken 13:48
kilden bruker
På andre språk...                            


9 svar

stemmer
14

@Staale

Det er en bedre måte:

job = dict(zip(keys, values))
Svarte 03/09/2008 kl. 14:51
kilden bruker

stemmer
13

Jeg vil si at en ordbok er definitivt den beste måten å gjøre det. Det er lett å utvide, kan du gi hver verdi et fornuftig navn, og Python har en rekke innebygde språk funksjoner for bruk og manipulere ordbøker. Hvis du trenger å legge til flere felt senere, er alt du trenger å endre koden som konverterer tuppel til en ordbok og koden som faktisk gjør bruk av de nye verdiene.

For eksempel:

job={}
job['jobid'], job['label'], job['username']=<querycode>
Svarte 03/09/2008 kl. 13:50
kilden bruker

stemmer
5

Dette er en gammel spørsmålet, men ...

Jeg vil foreslå å bruke en navngitt tuppel i denne situasjonen: collections.namedtuple

Dette er den delen, spesielt at du vil finne nyttig:

Subclassing er ikke nyttig for å legge til nye, lagret felt. I stedet, bare lage en ny som heter tuppel type fra _fields attributtet.

Svarte 17/07/2009 kl. 16:08
kilden bruker

stemmer
3

Kanskje dette er overkill for ditt tilfelle, men jeg ville være fristet til å lage en "jobb" klasse som tar tuppel som sin konstruktør argument og har respektive eiendommer på den. Jeg vil da passere forekomster av denne klassen rundt i stedet.

Svarte 03/09/2008 kl. 13:57
kilden bruker

stemmer
2

En gammel spørsmålet, men siden ingen nevnte det jeg vil legge dette fra Python Cookbook:

Oppskrift 81252: Bruk av dtuple for fleksibel søkeresultatet Tilgang

Denne oppskriften er spesielt utviklet for å håndtere database resultater, og dtuple løsningen lar deg få tilgang til resultatene ved navn eller indeksnummer. Dette slipper å få tilgang til alt av senket noe som er svært vanskelig å opprettholde, som nevnt i spørsmålet ditt.

Svarte 22/12/2008 kl. 20:22
kilden bruker

stemmer
2

Jeg ville bruke en ordbok. Du kan konvertere tuppel til en ordbok på denne måten:

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

Dette vil først opprette en matrise [[ "jobid", VAL1], [ "label", VAL2], [ "brukernavn", val3]] og deretter konvertere til en ordbok. Hvis resultatet ordre eller telle endringer, trenger du bare å endre listen over tastene for å matche det nye resultatet.

PS fortsatt friskt på Python meg selv, så det kan være bedre måter av å gjøre dette.

Svarte 03/09/2008 kl. 13:59
kilden bruker

stemmer
0

Hvis du bruker MySQLdb pakken, kan du sette opp markøren objekter for å returnere dicts stedet for tupler.

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
Svarte 09/04/2010 kl. 16:28
kilden bruker

stemmer
0

Med en tuppel vil det alltid være en hassle å legge til eller endre felter. Du har rett i at en ordbok vil være mye bedre.

Hvis du vil ha noe med litt vennligere syntaks kan det være lurt å ta en titt på svarene på dette spørsmålet om en enkel 'struct-aktig' objekt. På den måten kan passere rundt et objekt, si job, og få tilgang til sine felt enda lettere enn en tuppel eller dict:

job.jobId, job.username = jobId, username
Svarte 03/09/2008 kl. 13:51
kilden bruker

stemmer
-2

Hva med dette:

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

Deretter kan du gjøre:

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

Det skal være enkelt å bytte self.fieldlist.index(field)med en ordbok oppslag senere ... bare redigere __init__metoden! Noe som Staale gjør.

Svarte 03/09/2008 kl. 14:02
kilden bruker

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