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

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

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

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

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

4 Solutions collect form web for “Можно ли объявить функцию без аргументов, но затем передать некоторые аргументы этой функции без повышения исключения?”

 >>> 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 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'} 

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

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

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

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

 foo(1,2) 

дает вам кортеж (1, 2) внутри вашей функции.

Вот декоратор функций, который я написал, чтобы сделать именно это, а также пример использования:

 def IgnoreExtraArguments(f): import types c = f.func_code if c.co_flags & 0x04 or c.co_flags&0x08: raise ValueError('function already accepts optional arguments') newc = types.CodeType(c.co_argcount, c.co_nlocals, c.co_stacksize, c.co_flags | 0x04 | 0x08, c.co_code, c.co_consts, c.co_names, c.co_varnames+('_ignore_args','_ignore_kwargs'), c.co_filename, c.co_name, c.co_firstlineno, c.co_lnotab, c.co_freevars, c.co_cellvars) f.func_code = newc return f if __name__ == "__main__": def f(x,y): print x+y g = IgnoreExtraArguments(f) g(2,4) g(2,5,'banana') class C(object): @IgnoreExtraArguments def m(self,x,y): print xy a=C() am(3,5) am(3,6,'apple') 
  • исключение python не распознано; как обращаться с исключением?
  • Должен ли метод проверки выдавать исключение?
  • python: восстановить исключение из блока try, если в итоге блок вызывает исключение
  • Какое исключение я должен поднимать по неправильным / незаконным комбинациям аргументов в Python?
  • использование ключевого слова pass в python
  • Поймать любую ошибку в Python
  • 'sys.excepthook' и threading
  • Написание типа Python с исключениями
  • Python - лучший язык программирования в мире.