是否可以声明一个无参数的函数,却在调用时传递参数而不引发异常?

19 投票
5 回答
92493 浏览
提问于 2025-04-15 19:08

在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)。(可以看评论)

还有一点,就是如果没有参数,你怎么去访问这些参数呢?

撰写回答