В Python возможно иметь вышеупомянутый код, не повышая исключение?
def myfunc():
pass
# TypeError myfunc() takes no arguments (1 given)
myfunc('param')
Обычно в php при некоторых обстоятельствах я запускаю функцию без параметров и затем получаю параметры в функции.
На практике я не хочу объявлять аргументы в myfunc и затем передающий некоторые аргументы ему. Единственное одно решение, которое я нашел, myfunc(*arg)
. Есть ли какие-либо другие методы?
>>> def myFunc(*args, **kwargs):
... # This function accepts arbitary arguments:
... # Keywords arguments are available in the kwargs dict;
... # Regular arguments are in the args tuple.
... # (This behaviour is dictated by the stars, not by
... # the name of the formal parameters.)
... print args, kwargs
...
>>> myFunc()
() {}
>>> myFunc(2)
(2,) {}
>>> myFunc(2,5)
(2, 5) {}
>>> myFunc(b = 3)
() {'b': 3}
>>> import dis
>>> dis.dis(myFunc)
1 0 LOAD_FAST 0 (args)
3 PRINT_ITEM
4 LOAD_FAST 1 (kwargs)
7 PRINT_ITEM
8 PRINT_NEWLINE
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
И чтобы ответить на вопрос: нет, я не верю, что есть другие пути.
Основная причина довольно проста: C python основан на стеке. Функция, не требующая параметров, не будет иметь выделенного для нее места на стеке ( (см. комментарии)myFunc
, вместо этого, имеет их в позиции 0 и 1).
Дополнительный момент - как бы вы получили доступ к параметрам в противном случае?
Конечно можно!
Вы можете определить списки параметров переменной длины следующим образом:
def foo(*args):
print len(args)
args - это кортеж ваших параметров, поэтому при вызове:
foo(1,2)
вы получите кортеж (1, 2) внутри вашей функции.
Есть два способа для передачи аргументов в
По позиции
>>> def myfunc(*args):
... print "args", args
...
>>> myfunc("param")
args ('param',)
По ключевому слову
>>> def myfunc(**kw):
... print "kw", kw
...
>>> myfunc(param="param")
kw {'param': 'param'}
И вы можете использовать комбинацию обоих
>>> def myfunc(*args, **kw):
... print "args", args
... print "kw", kw
...
>>> myfunc("param")
args ('param',)
kw {}
>>>
>>> myfunc(param="param")
args ()
kw {'param': 'param'}
>>>
>>> myfunc("param", anotherparam="anotherparam")
args ('param',)
kw {'anotherparam': 'anotherparam'}