Лучший способ убедиться, что пользователь указывает один и только один из двух параметров функции в Python - PullRequest
0 голосов
/ 09 ноября 2018

В some_function у меня есть два параметра freq и frac, я не хочу, чтобы пользователи указывали оба или ни один из них. Я хочу, чтобы они указали только один из них.

Вот рабочий код:

def some_function(freq=False, frac=False):
    if (freq is False) & (frac is False):
        return (str(ValueError)+': Both freq and frac are not specified')
    elif (freq is not False) & (frac is not False):
        return (str(ValueError)+': Both freq and frac are specified')
    elif (freq is not False) & (frac is False):
        try:
            print ('Do something')
        except Exception as e:
            print (e)
    elif (freq is False) & (frac is not False):
        try: 
            print ('Do something else')
        except Exception as e:
            print (e)
    else: return (str(ValueError)+': Undetermined error')

Существуют ли лучшие и менее многословные практики для выражения этого в Python?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Здесь вы многое делаете неправильно Вы можете проверить not frac вместо frac is False, вы должны использовать логический and вместо побитового &, и вы должны повышать эти ValueError с, не возвращая их:

def some_function(freq=False, frac=False):
    if not freq and not frac:
        raise ValueError('Both freq and frac are not specified')
    elif freq and frac:
       raise ValueError('Both freq and frac are specified')
    elif freq:      
        print ('Do something')
    else:
        print ('Do something else')

Как правило, вы ищете один из двух вариантов. Почему бы не потребовать, чтобы пользователь передал единственное логическое значение, а затем представляет freq, если True, и frac, если False?

def some_function(freq):
    if freq: 
        print ('Do something')
    else:
        print ('Do something else')
0 голосов
/ 09 ноября 2018

Мертвое простое питоническое решение: используйте две разные функции (в конечном итоге они могут быть просто фасадами для реальной):

__all__ = ["freqfunc", "fracfunc"]

# private implementation
def _somefunc(freq=False, frac=False):
   # your code here

def freqfunc(freq):
    return _somefunc(freq=freq)

def fraqfunc(frac):
    return _somefunc(frac=frac)

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

0 голосов
/ 09 ноября 2018

Вы можете использовать assert перед вашим if заявлением. Тип ваших входов неясен; в общем, я бы использовал None, если бы знал, что это неверный ввод.

def some_function(freq=None, frac=None):

    freq_flag = freq is not None
    frac_flag = frac is not None

    assert freq_flag + frac_flag == 1, "Specify exactly one of freq or frac"

    if freq_flag:
        print('Do something')

    elif frac_flag:
        print('Do something else')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...