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