Функция, которая принимает один параметр или другой - PullRequest
0 голосов
/ 15 июня 2019

Я хочу написать функцию Python, которая должна принимать либо параметр1, либо параметр2, но не оба, а не 0.

т.е. Я хочу иметь функцию что-то вроде

def fun(param1 = None, param2 = None):
  if all(p is None for p in {param1, param2}):
    raise ValueError('Expected either param1 xor param2')

  if both(param1 and param2):
    raise ValueError('Expected either param1 xor param2')

Если param1 и param2 не имеют одинаковых свойств.

Как я мог это сделать?

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Вы, кажется, задаете 2 вопроса одновременно.

  • Чтобы иметь несколько различных входных данных
  • Чтобы получить эксклюзив или

Первая часть получается с использованием подстановочного аргумента и добавлением возможного ключевого аргумента послеit

def fun(*args, arg1=None, arg2=None): 
    print(arg1, arg2)

Теперь я могу вызывать функцию с любым из двух желаемых аргументов ключевого слова. Обратите внимание, что я должен определить аргументы ключевого слова arg1 и arg2, если я хочу добавить any значения для них.

Например:

fun()                  # None None
fun(arg1=1)            # 1 None
fun(arg2=2)            # None 2
fun(arg1=3, arg2=4)    # 3, 4

# Calls without keyword are stored inside args
fun(1)                 # None None

Во второй части мы можем распаковать оператор xor в исходную форму '(a, а не b) или (не aи б) '

Затем мы получим следующий код и протестируем.

def fun(*args, arg1=None, arg2=None):
    print(arg1, arg2)
    if (arg1 and not arg2) or (not arg1 and arg2):
        print(arg1, arg2)
        return
    return "Error"

fun()                  # None None
fun(1)                 # None None
fun(arg1=1)            # 1 None
fun(arg2=2)            # None 2
fun(arg1=3, arg2=4)    # 3 4

Я предполагаю, что arg1 и arg2 содержат некоторые значения, которые не преобразуются в логическое значение False,Если это так, вам нужно добавить проверку «Нет», чтобы избежать ошибок.

0 голосов
/ 15 июня 2019

Мое мнение о проблеме:

def fun(*args):
    if len(set(i for i, arg in enumerate(args) if arg is not None)) != 1:
        # raise ValueError
        print('Error')
        return
    param1, param2 = args
    print(param1, param2)

fun(1, 1)
fun(1, None)
fun(None, 2)
fun(None, None)

Отпечатки:

Error
1 None
None 2
Error
...