Python Bölme tuples - en iyi uygulama?

oy
12

Bir SQL sorgusu bir satırı - Bir tuple döndüren benim Python kodunda bir yöntem var. en çok üç alanı vardır varsayalım: (jobId, etiket, kullanıcı adı)

işlevler arasında etrafında geçerek kolaylığı için, ben 'iş' olarak adlandırılan bir değişken olarak tüm tuple geçen oldum. Sonunda, ancak, bit almak istiyorum, bu yüzden böyle bir kod kullanıyorum: (jobId, etiket, kullanıcı adı) = iş

şimdi benim varolan tüm kodu bozmadan sonuç grubuyla yeni alanlar eklemek asla, çünkü bu bir bakım kabus olduğunu, ancak, fark ettik. Bunu nasıl yazdım gerekir?

İşte benim iki en iyi tahmin: (jobId, etiket, kullanıcı adı) = 15 ... 20 alanlara sahip olduğunda (iş [0], iş [1], iş [2]) ... ama bu güzel ölçeklendirme değil

veya hemen bir sözlüğe SQL sorgusuna ilişkin sonuçları dönüştürmek ve çevresinde o geçmek (Ben bu benim için düzeltilenekadar, bir demet olarak hayata başlıyor gerçeği üzerinde kontrol yok)

Oluştur 03/09/2008 saat 12:48
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
13

Ben bir sözlük bunu yapmanın en iyi yolu kesinlikle söyleyebilirim. Bu, kolayca genişletilebilir var her değerini mantıklı bir isim vermek sağlar ve Python kullanarak ve sözlükleri işlemek için yerleşik dil özellikleri bir yeri vardır. Daha sonra daha fazla alan eklemek gerekirse, değiştirmek için gereken tüm sözlükten ve aslında yeni değerler kullanır koduna tuple dönüştüren koddur.

Örneğin:

job={}
job['jobid'], job['label'], job['username']=<querycode>
Cevap 03/09/2008 saat 12:50
kaynak kullanıcı

oy
0

Bir demet ile her zaman ekleyebilir veya alanları değiştirmek için bir güçlük olacaktır. Bir sözlüğü çok daha iyi olacağına haklısın.

Eğer biraz daha dostça sözdizimi ile bir şeyler istiyorsanız yanıtlara bir göz atmak isteyebilirsiniz bu soruyu basit bir 'yapı benzeri' nesnesi hakkında. Bu yolla diyelim ki, bir nesnenin etrafında geçebilir jobve bir tuplea veya dict bile daha kolayca alanlarını erişmek:

job.jobId, job.username = jobId, username
Cevap 03/09/2008 saat 12:51
kaynak kullanıcı

oy
3

Belki de bu dava için overkill, ama üzerinde ilgili özellikler onun yapıcı argüman olarak tuple alır ve bir "İş" sınıf oluşturmak için cazip olacaktır. Sonra etrafında yerine bu sınıfın örneklerini geçerdi.

Cevap 03/09/2008 saat 12:57
kaynak kullanıcı

oy
2

Ben bir sözlük kullanmak. Bir sözlüğe bu yolu tuple dönüştürebilirsiniz:

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

Bu da ilk olarak dizi [[ "jobid", val1], [ "etiketini", değer2], [ "kullanıcı adı", VAL3]] ve daha sonra bir sözlüğe olduğunu dönüştürmek yaratacaktır. Sonuç emri veya değişiklikleri sayarsak, sadece yeni bir sonuç eşleşecek tuşlarının listesini değiştirmek gerekir.

PS hala Python kendim üzerinde, çok taze Bunu yaparken daha iyi yollar olabilir.

Cevap 03/09/2008 saat 12:59
kaynak kullanıcı

oy
-2

Buna ne dersin:

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

Daha sonra yapabileceği:

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

Takas kolay olmalıdır self.fieldlist.index(field)sadece düzenleyebilir ... daha sonra bir sözlük arama ile __init__yöntemini! Staale gibi bir şey yok.

Cevap 03/09/2008 saat 13:02
kaynak kullanıcı

oy
13

@Staale

Daha iyi bir yol yoktur:

job = dict(zip(keys, values))
Cevap 03/09/2008 saat 13:51
kaynak kullanıcı

oy
2

Eski bir soru, kimse söz ama beri Python yemek kitabından bu ekleyeceğiz:

Reçete 81252: Esnek Sorgu sonucu Erişim için dtuple kullanma

Bu tarif, özellikle veritabanı sonuçları ile başa çıkmak için tasarlanmıştır ve dtuple çözümü adına VEYA indeks sayısına göre sonuçlar erişmenizi sağlar edilir. Bu sorunuzun belirtildiği üzere, muhafaza etmek çok zordur subscript her şeyi erişmek zorunda kaçınır.

Cevap 22/12/2008 saat 19:22
kaynak kullanıcı

oy
5

Bu eski bir soru ama ...

Çünkü bu durumda adlandırılmış başlığın kullanmanızı öneririz ediyorum: collections.namedtuple

Bu konuda yararlı olacağımı özellikle parçasıdır:

Subclassing yeni, depolanan alanlar eklemek için kullanışlı değildir. Bunun yerine, basitçe _fields özelliğinden yeni adlandırılmış kayıt düzeni türü oluşturun.

Cevap 17/07/2009 saat 15:08
kaynak kullanıcı

oy
0

Eğer MySQLdb paketini kullanıyorsanız, bunun yerine dizilerini dicts dönmek için imleç nesneleri ayarlayabilirsiniz.

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
Cevap 09/04/2010 saat 15:28
kaynak kullanıcı

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