В Python есть несколько типов аргументов:
- позиционная и ключевое слово
- имя и произвольный
Функция аргумент в Python является операцией атрибуции, то есть аргументы, назначенные к переменным в пространстве имен функций.
Если у вас есть заявление, как это:
def some_func(pos_arg1, pos_arg2, kw_arg1=1, kw_arg2='test'):
print "postional arg 1 =", pos_arg1
print "postional arg 2 =", pos_arg2
print "keyword arg 1 =", kw_arg1
print "keyword arg 2 =", kw_arg2
позиционных аргументы являются обязательными, и будут назначены в указанном порядке, но ключевые аргументы являются необязательными и могут быть вызваны в любом порядке - когда опущено, названный ключевое слово аргументы принимают объявленные значения по умолчанию (1 и «тест» в примере). До сих пор:
>>> some_func(1) # positional arguments are mandatory
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: some_func() takes at least 2 arguments (1 given)
>>> some_func(1, 2) # this is ok
postional arg 1 = 1
postional arg 2 = 2
keyword arg 1 = 1
keyword arg 2 = test
>>> some_func(1, 2, 3) # this is also ok, keyword args may work like positional
postional arg 1 = 1
postional arg 2 = 2
keyword arg 1 = 3
keyword arg 2 = test
>>> some_func(1, 2, 3, 4) # this is also ok, keyword args may work like positional
postional arg 1 = 1
postional arg 2 = 2
keyword arg 1 = 3
keyword arg 2 = 4
>>> some_func(1, 2, kw_arg2=3) # kyword arguments may be given in any order
postional arg 1 = 1
postional arg 2 = 2
keyword arg 1 = 1
keyword arg 2 = 3
Существует проблема с необъявленными аргументами:
>>> some_func(1, 2, 3, 4, 5)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: some_func() takes at most 4 arguments (5 given)
Но вы можете иметь произвольное число аргументов, при помощи специальной формы *
и **
:
>>> def some_func(pos_arg1, pos_arg2, *args, **kw_args):
... print "postional arg 1 =", pos_arg1
... print "postional arg 2 =", pos_arg2
... print "other positional orgs =", args
... print "other keyword args =", kw_args
...
>>> some_func(1, 2, 3, 4, 5) # any number of arguments
postional arg 1 = 1
postional arg 2 = 2
other positional orgs = (3, 4, 5)
other keyword args = {}
>>> some_func(1, 2, a=3, x=4, y=5) # * and ** are optional
postional arg 1 = 1
postional arg 2 = 2
other positional orgs =()
other keyword args = {'a': 3, 'x': 4, 'y': 5}
>>> some_func(1, 2, 'banana', 'orange', 'apple', a=3, x=4, y=5)
postional arg 1 = 1
postional arg 2 = 2
other positional orgs = ('banana', 'orange', 'apple')
other keyword args = {'a': 3, 'x': 4, 'y': 5}
>>>
Аргумент *
будет доступен как кортеж позиционных аргументов, а **
будет аргументом ключевого слова ,
Вы можете смешивать все вместе, но есть правило: все аргументы ключевого слова должны быть объявлены после позиционных аргументов, и все произвольные должны быть указаны после именованных.
Спасибо, это имеет смысл. – Josh