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

В Python возможно иметь вышеупомянутый код, не повышая исключение?

def myfunc():
    pass

# TypeError myfunc() takes no arguments (1 given)
myfunc('param')

Обычно в php при некоторых обстоятельствах я запускаю функцию без параметров и затем получаю параметры в функции.

На практике я не хочу объявлять аргументы в myfunc и затем передающий некоторые аргументы ему. Единственное одно решение, которое я нашел, myfunc(*arg). Есть ли какие-либо другие методы?

13
задан Dana 11 February 2010 в 00:02
поделиться

3 ответа

>>> 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). (см. комментарии)

Дополнительный момент - как бы вы получили доступ к параметрам в противном случае?

14
ответ дан 1 December 2019 в 19:07
поделиться

Конечно можно!

Вы можете определить списки параметров переменной длины следующим образом:

def foo(*args):
    print len(args)

args - это кортеж ваших параметров, поэтому при вызове:

foo(1,2)

вы получите кортеж (1, 2) внутри вашей функции.

7
ответ дан 1 December 2019 в 19:07
поделиться

Есть два способа для передачи аргументов в

По позиции

>>> 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'}
16
ответ дан 1 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: