Python 是否可以声明一个没有参数的函数,然后将一些参数传递给该函数而不引发异常?
在python中,是否可以在不引发异常的情况下使用上述代码Python 是否可以声明一个没有参数的函数,然后将一些参数传递给该函数而不引发异常?,python,exception,arguments,Python,Exception,Arguments,在python中,是否可以在不引发异常的情况下使用上述代码 def myfunc(): pass # TypeError myfunc() takes no arguments (1 given) myfunc('param') 通常在php中,在某些情况下,我启动一个没有参数的函数,然后检索函数中的参数 实际上,我不想在myfunc中声明参数,然后将一些参数传递给它。我找到的唯一解决方案是myfunc(*arg)。还有其他方法吗?当然可以 您可以定义可变长度参数列表,如下所示: d
def myfunc():
pass
# TypeError myfunc() takes no arguments (1 given)
myfunc('param')
通常在php中,在某些情况下,我启动一个没有参数的函数,然后检索函数中的参数
实际上,我不想在myfunc中声明参数,然后将一些参数传递给它。我找到的唯一解决方案是myfunc(*arg)
。还有其他方法吗?当然可以
您可以定义可变长度参数列表,如下所示:
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'}
事实上要回答这个问题:不,我不相信还有其他方法
主要原因很简单:C python是基于堆栈的。不需要参数的函数不会在堆栈上为其分配空间(myFunc
,而是将它们放在位置0和1)。(见评论)
另外一点是,如果不是这样,您将如何访问参数?下面是我编写的一个函数修饰符,以及一个用法示例:
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 x-y
a=C()
a.m(3,5)
a.m(3,6,'apple')
为什么
myfunc(*arg)
不够好?我猜yuri(还)不知道*arg实现需要将myfunc作为一个回调传递给另一个函数,该函数尝试在传递参数的列表中调用它。因此,我无法控制回调实现,用户不能故意忽略*args
(在我关心此事件的代码中),因此这将是一个错误并引发异常,用户将记住放置*args
。为什么您希望php语法在python中工作?在这种情况下,我也不确定您为什么认为*arg不够好。args
实际上是一个元组。堆栈注释不是重点。Python是基于堆栈的,但参数传递(和解析)不是(参数始终是堆栈上的一个项目,即使没有参数)。Python之所以不忽略参数,是因为它会隐藏错误。确实很可能我误读了dis告诉我的内容:)哈哈,完全是OTT。我喜欢它。从没想过我会在python函数中看到decorator模式。您应该添加显示docstring帮助的功能来完成这项工作,并添加python3更新。
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 x-y
a=C()
a.m(3,5)
a.m(3,6,'apple')