Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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_Arguments_Parameter Passing - Fatal编程技术网

Python 将相同值传递给参数的紧凑方法

Python 将相同值传递给参数的紧凑方法,python,arguments,parameter-passing,Python,Arguments,Parameter Passing,当我有一个带有一堆可选参数的函数时 def function_name(arg1=0, arg2=0, arg3=0, arg4=0, ...): .....doing anything 我想把相同的值传递给其中一些 function_name(arg1=1, arg3=1, arg6=1) 有没有更紧凑的方法? 所以我不必一直复制=value并填充行 经过几次有益的回答,我想我找到了我想要的答案: def myargs(value, *args): kargs = {}

当我有一个带有一堆可选参数的函数时

def function_name(arg1=0, arg2=0, arg3=0, arg4=0, ...):
      .....doing anything
我想把相同的值传递给其中一些

function_name(arg1=1, arg3=1, arg6=1)
有没有更紧凑的方法? 所以我不必一直复制=value并填充行

经过几次有益的回答,我想我找到了我想要的答案:

def myargs(value, *args):
    kargs = {}
    for arg in args:
        kargs[arg] = value
    return kargs


function_name(**myargs(1, 'arg1', 'arg3', 'arg6'))

谢谢大家,如果我不善于解释我需要什么,我很抱歉。

您可以使用默认参数:

def func(arg1, arg2, def_arg1="1", def_arg2="2"):
    pass
您可以使用**kwargs


如果具有相同值的参数是连续的,则:

def function_name(arg1=0,arg2=0,arg3=0,arg4=0):
    print(arg1, arg2, arg3, arg4)

function_name(2, *[1] * 3)
印刷品:

2 1 1 1

我想你要做的是打开包装。您可以将字典传递给函数,它将解压包含的参数。任何未包含的内容都使用默认值

def测试(w=0,x=0,y=0,z=0): 返回w+x+y+z kwargs_1={'y':1} kwargs_2={'x':2,'z':3} 测试(**kwargs_1) #返回: 1. 测试(**kwargs_2) #返回: 5.
如果您没有编写该函数,并且无法更改其签名,则可以通过这种方式传递正确数量的参数:

function_name(*(0,) * function_name.__code__.co_argcount)
它将把相同的值(在这种情况下,
0
)传递给函数期望的所有参数

例如,如果只需要传递10个参数,可以编写:

function_name(*(0,) * 10)
如果要按特定参数的位置而不是名称作为目标,可以使用以下方法:

import inspect


def func(a, b, c=None, d='foo', e=False):
    print(a, b, c, d, e)


def fill_args(fun, value, arg_numbers):
    return {
        name: value
        for name in (
            tuple(inspect.signature(fun).parameters)[i]
            for i in arg_numbers
        )
    }


if __name__ == '__main__':
    func(**fill_args(func, 0, (0, 1, 2)))
    func(**fill_args(func, 'bar', (0, 1, 4)))
    func(**fill_args(func, True, (0, 1, 3)))

有多少个可选参数?它们总是具有相同的值吗?传递3个参数似乎不是问题,你可以交替地进行dict-kwargs映射,我猜大约30个。不是我的职责。我需要通过不到10次的考试。这其实不是什么问题,我只是想知道是否有更好的方法来做。如果我想通过所有的考试或者前几个考试,那就行了。在我的例子中,我可能需要无序地传递arg2和arg4等等,而不是所有参数。所有参数都是可选的。我需要将值传递给特定的值。据我所知,您的解决方案只会将值传递给前10个参数。虽然我可能需要将相同的值传递给第5个、第7个、第11个等参数,但将其余的作为默认值。
import inspect


def func(a, b, c=None, d='foo', e=False):
    print(a, b, c, d, e)


def fill_args(fun, value, arg_numbers):
    return {
        name: value
        for name in (
            tuple(inspect.signature(fun).parameters)[i]
            for i in arg_numbers
        )
    }


if __name__ == '__main__':
    func(**fill_args(func, 0, (0, 1, 2)))
    func(**fill_args(func, 'bar', (0, 1, 4)))
    func(**fill_args(func, True, (0, 1, 3)))