Handle either a list or single integer as an argument
A function should select rows in a table based on the row name (column 2 in this case). It should be able to take either a single name or a list of names as arguments and handle them correctly.
This is what I have now, but ideally there wouldn't be this duplicated code and something like exceptions would be used intelligently to choose the right way to handle the input argument:
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)
Actually I agree with Andrew Hare above, just pass a list with a single element.
But if you really must accept a non-list, how about just turning it into a list in that case?
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)
The performance penalty for doing 'in' on a single-item list isn't likely to be high :-) But that does point out one other thing you might want to consider doing if your 'to_select' list may be long: consider casting it to a set so that lookups are more efficient.
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)
-----N
You could redefine your function to take any number of arguments, like this:
def select_rows(*arguments):
for row in range(0, table.numRows()):
if _table.item(row, 1).text() in arguments:
table.selectRow(row)
Then you can pass a single argument like this:
select_rows('abc')
multiple arguments like this:
select_rows('abc', 'def')
And if you already have a list:
items = ['abc', 'def']
select_rows(*items)
I would do just this:
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)
and expect that the argument will always be a list - even if its just a list of one element.
Remember:
It is easier to ask for forgiveness than permission.
链接地址: http://www.djcxy.com/p/54236.html上一篇: Python简单交换函数
下一篇: 处理一个列表或单个整数作为参数