Аргументы только по позиции
Продолжая изучать Python, вы встретите такую концепцию, как аргументы функций. В Python есть разные способы передачи аргументов в функцию: аргументы по умолчанию, именованные аргументы и позиционные аргументы. Но существует особый вид аргументов, которые можно передавать только по позиции, а не по имени, — это аргументы только по позиции.
Начиная с Python 3.8, в определениях функций появился специальный синтаксис
/
, который указывает, что некоторые аргументы являются только позиционными. Такие аргументы располагаются перед /
в определении функции.Рассмотрим функцию, которая складывает три числа:
def add_numbers(a, b, c):
return a + b + c
Мы можем вызвать эту функцию, передавая аргументы в порядке их определения, то есть по позиции:
print(add_numbers(10, 20, 30))
# outputs: 60
А можем вызвать ее, используя имена аргументов, то есть по ключу:
print(add_numbers(a=10, b=20, c=30))
# outputs: 60
Но что если мы хотим гарантировать, что некоторые аргументы всегда передаются в определенном порядке? Здесь на помощь приходят аргументы только по позиции. Давайте изменим функцию
add_numbers
, сделав a
и b
только позиционными:def add_numbers(a, b, /, c):
return a + b + c
Теперь мы можем вызвать эту функцию, передавая аргументы по позиции:
print(add_numbers(10, 20, 30)) # 60
print(add_numbers(a=10, b=20, c=30)) # TypeError
print(add_numbers(10, 20, c=30)) # 60
Однако если мы попытаемся передать аргументы только по позиции как именованные, получим
TypeError
. В этом случае a
и b
должны передаваться по позиции. Аргумент c
можно передать как по позиции, так и по имени.Итак, синтаксис для аргументов только по позиции следующий:
- Аргументы только по позиции располагаются перед
/
в определении функции.
- Если в определении функции присутствует
/
, то аргументы перед ним являются только позиционными.
- Аргументы только по позиции нельзя передать по имени.
- Аргументы после
/
можно передавать по позиции или по имени.
Есть ли встроенные функции в Python, которые имеют только позиционные аргументы?
Да, многие встроенные функции Python используют аргументы только по позиции. Например, функция
abs()
:help(abs)
# Help on built-in function abs in module builtins:
# abs(x, /)
# Return the absolute value of the argument.
abs(-6) # 6
abs(x=-6) # TypeError: abs() takes no keyword arguments
Параметр
x
в abs
является аргументом только по позиции, и если мы попытаемся передать его как именованный аргумент, программа выдаст TypeError
.