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

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

python,list,function,integer,

29

Ответов: 4


20 принят

На самом деле я согласен с ответом Эндрю Хэра , просто передайте список с одним элементом.

Но если вы действительно должны принять не-список, как просто превратить его в список в этом случае?

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)

15

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

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)

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)

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

Запомнить:

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


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)

Это полезно для работы с любым объектом, который поддерживает оператор in. Кроме того, предыдущая версия, если она задана кортежем или какой-либо другой последовательностью, просто поместила бы ее в список. Недостатком является то, что при использовании обработки исключений существует некоторая производительность.

питон, список, функция, целое число,
Похожие вопросы