Аргументы только по позиции
Продолжая изучать 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.