是否可以声明一个无参数的函数,却在调用时传递参数而不引发异常?
在Python中,有没有办法让上面的代码不抛出异常呢?
def myfunc():
pass
# TypeError myfunc() takes no arguments (1 given)
myfunc('param')
通常在PHP中,有时候我会调用一个没有参数的函数,然后在函数内部获取参数。
实际上,我不想在myfunc里声明参数,然后再把一些参数传给它。我找到的唯一解决办法是 myfunc(*arg)
。还有其他方法吗?
5 个回答
7
当然可以!
你可以这样定义可变长度的参数列表:
def foo(*args):
print len(args)
这里的args是一个包含你所有参数的元组,所以当你调用:
foo(1,2)
时,你在函数内部会得到一个元组(1, 2)。
16
传递参数有两种方式
按位置传递
>>> 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'}
19
>>> 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语言是基于栈的。一个不需要参数的函数在栈上不会分配空间((可以看评论)myFunc
,相反,它的参数在位置0和1)。
还有一点,就是如果没有参数,你怎么去访问这些参数呢?