2009-06-15 18 views
26

Bir işlev satır adını temel alan bir tablodaki satırları seçmelidir (bu durumda sütun 2). Tek bir isim veya argüman olarak isimler listesi alabilmeli ve doğru şekilde ele alabilmelidir.Bir liste veya tek bir tamsayıyı bir argüman olarak ele al

def select_rows(to_select): 
    # For a list 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 
    # For a single integer 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() == to_select: 
      table.selectRow(row) 

cevap

18

Aslında Andrew Hare ile aynı fikirdeyim, sadece tek bir öğeyle bir liste geçiriyorum.

Ancak liste dışı bir listeyi gerçekten kabul etmeniz gerekiyorsa, yalnızca bu durumda bir listeye dönüştürmeye ne dersiniz?

def select_rows(to_select): 
    if type(to_select) is not list: to_select = [ to_select ] 

    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

tek maddelik listede '' yaparak performans ceza yüksek :-) olması muhtemel değildir Ama bu bir şey daha size 'to_select eğer yapıyor düşünebilirsiniz işaret etmez 'liste uzun olabilir: aramaları daha verimli hale getirecek şekilde bir kümeye yerleştirmeyi düşünün.

def select_rows(to_select): 
    if type(to_select) is list: to_select = set(to_select) 
    elif type(to_select) is not set: to_select = set([to_select]) 

    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

----- N

11

yapardım:

Bu

Şimdi sahip, ama ideal giriş argüman işlemek için doğru yolu seçmek akıllıca kullanılacak istisnalar gibi bu yinelenmiş kodu ve bir şey olmaz ne sadece bu: - bir elemanın bile onun sadece bir liste

def select_rows(to_select): 
    # For a list 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

ve argüman her zaman bir liste olacağını bekliyoruz.

Unutmayın:

, izin daha af sormak daha kolaydır.

+1

+1 ... bir görevi yerine getirmek için yalnızca bir kod setini ve daha pythonic'i korumak çok daha kolay; Birisi dokümanlar karşıtı olarak çağırırsa patlayabilir. Bir argüman olarak tek bir tam sayıyı kabul eden bir fonksiyona gerçekten ihtiyaç duyulursa, 'def select_row (to_select)' adında bir ikincisini yapın ve 'to_select' öğesini bir liste olarak paketleyin, ardından select_rows öğesini çağırın. –

14

Bunu, herhangi bir sayıda argüman almak için işlevini yeniden tanımlamak olabilir: böyle

select_rows('abc') 

birden argümanlar:

def select_rows(*arguments): 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in arguments: 
      table.selectRow(row) 

Sonra böyle tek bir argüman iletebilirsiniz:

select_rows('abc', 'def') 

t:

items = ['abc', 'def'] 
select_rows(*items) 
+0

+1 Bu yaklaşımı Andrew Hare'ınkinden daha iyi ...Daha fazla argümanı aynı işleve, sadece liste/tek argümana değil, aktarmanız gerekirse sorun olabilir. Ama daha önce bunlara sahip olabilirsiniz ya da anahtar kelime argümanlarını kullanabilirsiniz, yani ** kwargs. – Jaime

+0

Bu cevap açıkça daha iyi. +1 Kendinden belgeleme kodu. * args yinelenen için yalvarır. – tortal

3

Ben Sharkey'nın sürümü ile birlikte gitmek, ama biraz daha ördek yazarak kullanmayı tercih ediyorum: Bu, herhangi bir nesne ile çalışma yararı vardır

def select_rows(to_select): 
    try: 
     len(to_select) 
    except TypeError: 
     to_select = [to_select] 

    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

Bu operatörde destekler. Ayrıca, bir önceki versiyon, bir tuple veya başka bir sırayla verilirse, onu bir listeye koyardı. Dezavantajı istisna işlemlerini kullanmak için bazı performans cezası olmasıdır.

+0

Bu, unicodes ve dizeler için sorunludur. cf: http://stackoverflow.com/questions/305359/correct-way-to-detect-sequence-parameter/425567#425567 –

+0

Geçerli nokta, en az "in (liste, tuple)" olmalıdır ... veya belki de "(string, unicode)" değil. Tercihen, doğrudan "bu şey destek" in "için" bakmak istiyorum, sanırım. – NickZoic