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

Если у вас есть несколько определений функций в одном октавном файле, вы используете autoload(). Итак, если у вас есть foo.oct с функциями foo и bar, то вы делаете:

autoload ("bar", "path-to-foo.oct");
37
задан Brian Tompsett - 汤莱恩 27 September 2016 в 18:20
поделиться

5 ответов

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

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

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)
23
ответ дан 27 November 2019 в 04:49
поделиться

Простая обертка могла сделать, для обработки случая объекта списка или отдельного объекта

  def wrap_list(val):
    if type(val) is list:
      return val
    return [val] 
0
ответ дан 27 November 2019 в 04:49
поделиться

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

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)

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

Помните:

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

12
ответ дан 27 November 2019 в 04:49
поделиться

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

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
ответ дан 27 November 2019 в 04:49
поделиться

Я бы согласился с версией Шарки, но использовал бы немного больше утиной печати:

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
ответ дан 27 November 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: