Подтвердить что ты не робот

Обрабатывать список или одно целое в качестве аргумента

Функция должна выбирать строки в таблице на основе имени строки (в этом случае в этом случае в столбце 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)
4b9b3361

Ответ 1

Собственно, я согласен с 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" может быть длинным: подумайте о том, чтобы отнести его к набору, чтобы поисковые запросы были более эффективными.

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)

----- Н

Ответ 2

Вы можете переопределить свою функцию для принятия любого количества аргументов, например:

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)

Ответ 3

Я бы сделал именно это:

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)

и ожидаем, что аргумент всегда будет списком - даже если его просто список одного элемента.

Помните:

Легче попросить прощения, чем разрешение.

Ответ 4

Я бы согласился с версией 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. Кроме того, предыдущая версия, если она задана кортежем или какой-либо другой последовательностью, просто поместила бы ее в список. Недостатком является то, что для обработки исключений существует некоторая производительность.