web-dev-qa-db-ja.com

引数としてリストまたは単一の整数を処理する

関数は、行名(この場合は列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)
40
Steven Hepting

実際、私は Andrew Hareの答え に同意します。単一の要素を含むリストを渡すだけです。

しかし、もしあなたが本当に非リストを受け入れなければならないなら、その場合それをリストに変えるだけではどうですか?

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)

単一項目リストで「in」を実行することによるパフォーマンスのペナルティはそれほど高くない可能性が高いです:-)しかし、それは、「to_select」リストが長い可能性がある場合に実行することを検討する可能性のあるもう1つのことを指摘しています。キャストを検討してください。ルックアップがより効率的になるように、それをセットにしてください。

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)
26
NickZoic

次のように、関数を再定義して任意の数の引数を取ることができます。

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')

このような複数の引数:

select_rows('abc', 'def')

そして、すでにリストがある場合:

items = ['abc', 'def']
select_rows(*items)
18
Steef

私はこれだけをします:

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つの要素のリストであっても、リストであることを期待します。

覚えておいてください:

許可より許しを求める方が簡単です。

12
Andrew Hare

私はSharkeyのバージョンを使いますが、もう少しダックタイピングを使用します。

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)

これには、in演算子をサポートするオブジェクトを操作できるという利点があります。また、以前のバージョンでは、タプルまたはその他のシーケンスが指定されている場合、それをリストにラップするだけでした。欠点は、例外処理を使用するとパフォーマンスが低下することです。

3
DopplerShift

リストまたは単一オブジェクトのケースを処理するための単純なラッパー

  def wrap_list(val):
    if type(val) is list:
      return val
    return [val] 
0
FlashDD