Аргументы упаковочной функции

В функциях вы можете определить ряд обязательных аргументов:

 def fun1(arg1, arg2, arg3): 
    return (arg1,arg2,arg3)

 

что сделает функцию вызываемой только тогда, когда заданы три аргумента:

 fun1(1, 2, 3)

 

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

 def fun2(arg1='a', arg2='b', arg3='c'):
    return (arg1,arg2,arg3)

 

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

 fun2(1)              → (1,b,c)
fun2(1, 2)           → (1,2,c)
fun2(arg2=2, arg3=3) → (a,2,3)
...

 

Но вы также можете использовать синтаксис деструктурирующего упаковать аргументы, так что вы можете назначить переменные , используя list или dict .

Упаковка списка аргументов

Считайте, что у вас есть список значений

 l = [1,2,3]

 

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

 fun1(*l)
# Returns: (1,2,3)
fun1(*['w', 't', 'f'])
# Returns: ('w','t','f')

 

Но если вы не предоставите список, длина которого соответствует количеству аргументов:

 fun1(*['oops'])
# Raises: TypeError: fun1() missing 2 required positional arguments: 'arg2' and 'arg3'

 

Упаковка аргументов ключевых слов

Теперь вы также можете упаковать аргументы, используя словарь. Вы можете использовать ** оператор сказать Python распаковать dict в качестве значений параметров:

 d = {
  'arg1': 1,
  'arg2': 2,
  'arg3': 3
}
fun1(**d)
# Returns: (1, 2, 3)

 

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

 fun1(**{'arg1':1, 'arg2':2})
# Raises: TypeError: fun1() missing 1 required positional argument: 'arg3'
fun1(**{'arg1':1, 'arg2':2, 'arg3':3, 'arg4':4})
# Raises: TypeError: fun1() got an unexpected keyword argument 'arg4'

 

Для функций, которые имеют необязательные аргументы, вы можете упаковать аргументы как словарь:

 fun2(**d)
# Returns: (1, 2, 3)

 

Но там вы можете опустить значения, так как они будут заменены значениями по умолчанию:

 fun2(**{'arg2': 2})
# Returns: ('a', 2, 'c')

 

И так же, как и раньше, вы не можете давать дополнительные значения, которые не являются существующими параметрами:

 fun2(**{'arg1':1, 'arg2':2, 'arg3':3, 'arg4':4})
# Raises: TypeError: fun2() got an unexpected keyword argument 'arg4'

 

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

 def fun3(arg1, arg2='b', arg3='c')
    return (arg1, arg2, arg3)

 

Вы можете вызвать функцию просто с помощью итерации:

 fun3(*[1])
# Returns: (1, 'b', 'c')
fun3(*[1,2,3])
# Returns: (1, 2, 3)

 

или только со словарем:

 fun3(**{'arg1':1})
# Returns: (1, 'b', 'c')
fun3(**{'arg1':1, 'arg2':2, 'arg3':3})
# Returns: (1, 2, 3)

 

или вы можете использовать оба в одном вызове:

 fun3(*[1,2], **{'arg3':3})
# Returns: (1,2,3)

 

Остерегайтесь, однако, что вы не можете предоставить несколько значений для одного и того же аргумента:

 fun3(*[1,2], **{'arg2':42, 'arg3':3})
# Raises: TypeError: fun3() got multiple values for argument 'arg2'