Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以声明一个没有参数的函数,然后将一些参数传递给该函数而不引发异常?_Python_Exception_Arguments - Fatal编程技术网

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

在python中,是否可以在不引发异常的情况下使用上述代码

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