2009-06-15 14 views
26

के रूप में संभाल लें एक फ़ंक्शन पंक्ति नाम (इस मामले में कॉलम 2) के आधार पर तालिका में पंक्तियों का चयन करना चाहिए। यह या तो एक नाम या नामों की सूची तर्क के रूप में लेने और उन्हें सही तरीके से संभालने में सक्षम होना चाहिए।या तो एक सूची या एकल पूर्णांक को

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) 

उत्तर

18

वास्तव में मैं ऊपर एंड्रयू हारे से सहमत हूं, बस एक तत्व के साथ एक सूची पास करें।

लेकिन यदि आपको वास्तव में एक गैर-सूची स्वीकार करनी है, तो उसे उस मामले में केवल एक सूची में बदलने के बारे में कैसे?

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) 

एक एकल आइटम की सूची पर 'में' करने के लिए प्रदर्शन दंड उच्च :-) होने की संभावना नहीं है लेकिन उस का कहना है एक दूसरी बात आप अगर अपने 'to_select करने पर विचार करना चाह सकते हैं सूची लंबी हो सकती है: इसे सेट पर कास्टिंग करने पर विचार करें ताकि लुकअप अधिक कुशल हो।

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) 

----- एन

11

मुझे क्या करना होगा:

यह वही है मैं अब है, लेकिन आदर्श रूप में इस डुप्लिकेट किए गए कोड और अपवादों समझदारी से इस्तेमाल किया जाएगा सही तरीके से इनपुट तर्क को संभालने के लिए चयन करने के लिए की तरह कुछ नहीं होगा है सिर्फ इस:

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) 

और उम्मीद करते हैं कि तर्क हमेशा एक सूची हो जाएगा - भले ही इसकी सिर्फ एक तत्व की एक सूची।

याद रखें:

यह अनुमति से माफी के लिए पूछने के लिए आसान है।

+1

+1 ... कार्य करने के लिए कोड के केवल एक सेट को बनाए रखना बहुत आसान है, और अधिक पायथनिक; अगर कोई इसे दस्तावेज़ों के उल्लंघन में बुलाता है तो इसे विस्फोट कर दें। यदि कोई फ़ंक्शन वास्तव में आवश्यक है जो तर्क के रूप में एक पूर्णांक को स्वीकार करता है, तो 'def select_row (to_select)' नामक दूसरा व्यक्ति बनाएं और इसे 'to_select' सूची के रूप में पैकेज करें, फिर select_rows पर कॉल करें। –

14

आप इस तरह, तर्क के किसी भी संख्या में लेने के लिए अपने कार्य को फिर से परिभाषित कर सकते हैं:

select_rows('abc') 

इसी प्रकार अनेक तर्क:

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

तो फिर तुम इस तरह एक भी तर्क पारित कर सकते हैं:

select_rows('abc', 'def') 

और यदि आपके पास पहले से ही एक lis है टी:

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

+1 इस दृष्टिकोण की तरह एंड्रयू हारे की तुलना में बेहतर ...समस्या हो सकती है यदि आपको एक ही फ़ंक्शन में अधिक तर्क पारित करने की आवश्यकता होती है, न केवल सूची/एकल तर्क। लेकिन आप या तो पहले हो सकते हैं, या कीवर्ड तर्क का उपयोग कर सकते हैं, यानी ** kwargs। – Jaime

+0

यह उत्तर स्पष्ट रूप से बेहतर है। +1 स्व-दस्तावेज़ कोड। * तर्क एक पुनरावर्तनीय के लिए begs। – tortal

3

मैं शार्की के संस्करण के साथ जाना चाहते हैं, लेकिन थोड़ा अधिक बतख टाइपिंग का उपयोग करें:

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) 

यह किसी भी वस्तु के साथ काम करने का लाभ मिलता है जो ऑपरेटर में समर्थन करता है। साथ ही, पिछले संस्करण, अगर एक ट्यूपल या कुछ अन्य अनुक्रम दिया गया है, तो इसे सिर्फ एक सूची में लपेटेगा। नकारात्मकता यह है कि अपवाद हैंडलिंग का उपयोग करने के लिए कुछ प्रदर्शन जुर्माना है।

+0

यह एक यूनिकोड और तारों के लिए समस्याग्रस्त है। सीएफ: http://stackoverflow.com/questions/305359/correct-way-to-detect-sequence-parameter/425567#425567 –

+0

मान्य बिंदु, कम से कम "सूची (tuple)" होना चाहिए ... या शायद "में नहीं (स्ट्रिंग, यूनिकोड)"। अधिमानतः आप "मैं इस चीज़ का समर्थन करता हूं" के लिए सीधे देखना चाहता हूं, मुझे लगता है। – NickZoic

संबंधित मुद्दे