Pythonic способ иметь выбор из 2-3 вариантов в качестве аргумента функции - PullRequest
11 голосов
/ 01 марта 2012

У меня есть функция Python, для которой требуется ряд параметров, одним из которых является тип симуляции для выполнения.Например, параметры могут быть «солнечными», «видом» или «обоими».

Как Pythonic позволяет пользователю устанавливать эти значения?

Я вижу различные варианты:

  1. Используйте строковую переменную и проверьте ее - так будет: func(a, b, c, type='solar')

  2. Установите некоторые константы в классе и используйте func(a, b, c, type=classname.SOLAR)

  3. Если есть только две опции (как и для некоторых из моих функций), принудительно установите его в аргумент True / False, используя что-то вроде func(a, b, c, do_solar=False), чтобы заставить его использовать 'view 'option.

Какие-либо предпочтения (или другие идеи) для Pythonic способов сделать это?

Ответы [ 5 ]

7 голосов
/ 01 марта 2012

Если точка, которую Никлас делает в , его ответ не выполняется, я бы использовал строковый аргумент.В стандартной библиотеке есть модули Python, которые используют аналогичные аргументы.Например, csv.reader().

sim_func(a, b, c, sim_type='solar')

Не забудьте дать разумную ошибку внутри функции, которая поможет людям, если они введут неправильную вещь.

7 голосов
/ 01 марта 2012

Мне не нравится ни один из этих вариантов.

Я бы определил две разные функции, perform_solar(a, b, c) и perform_view(a, b, c), и позволил бы вызывающему решить, какие из них он хочет использовать, в каком порядке и с какими аргументами.

Если причина, по которой вы решили собрать их в одну функцию, заключается в том, что они разделяют состояние, вы должны поделиться этим состоянием в объекте и определить функции как методы.

2 голосов
/ 09 октября 2018

Вы можете использовать утверждение assert следующим образом:

assert sim_types in ['solar', 'view', 'both'], 'sim type parameter must be solar, view or both'

Если sim_types отсутствует в списке, python выдаст ошибку подтверждения

2 голосов
/ 02 марта 2012

Так как функции в Python являются объектами, вы можете обработать * args как список методов и передать типы симуляций в качестве произвольных аргументов в конце. Это даст вам возможность определять новые симуляции в будущем без необходимости рефакторинга этого кода.

def func(a, b, c, *args):
    for arg in args:
        arg(a, b, c)

def foosim(a, b, c):
    print 'foosim %d' % (a + b + c)

def barsim(a, b, c):
    print 'barsim %d' % (a * b * c)

Использование:

func(2, 2, 3, foosim)
func(2, 2, 3, barsim)
func(2, 2, 3, foosim, barsim)

Выход:

foosim 7
barsim 12
foosim 7
barsim 12
1 голос
/ 01 марта 2012

Вы можете использовать необязательные (ключевые слова) аргументы, подобные этому

def func(a, b, c, **kw):
    if kw.get('do_solar'):
        # Do Solar
    if kw.get('do_view'):
        # Do view
...