【问题标题】:How to correctly call function with optional parameters in python如何在python中正确调用带有可选参数的函数
【发布时间】:2015-05-19 12:14:04
【问题描述】:

我是 python 的初学者,我遇到了一个需要可选参数的函数的问题。 此函数获取可变数量的文件路径作为参数,可以是 2 到 n 个参数。 之后,可以将一定数量的可选参数传递给该函数。 我试图做这样的事情:

def compareNfilesParameters(*args):
    start_time = time.time()

    listFiles = []
    listParameters = []

    for argument in args:
        if str(argument).endswith(".vcf"):
            listFiles.append(str(argument))
        else:
            listParameters.append(argument)

因此,如果参数具有文件扩展名,则将其视为文件路径参数之一,其他参数则视为可选参数。

我想做的是让用户像这样调用函数:

function('a.vcf', 'b.vcf', 'c.vcf') 

function('a.vcf', 'b.vcf', 'c.vcf', 0, 1)

function('a.vcf', 'b.vcf', 'c.vcf', 0, 1, 4,...,3)

我尝试了不同的方法,但没有一个让我满意。

第一种方法是将函数声明为:

def compareNfilesParameters(*args)  

但是这样,如果我得到例如 3 个参数,2 肯定是文件路径,最后一个我不知道它指的是哪个变量。所以我需要指定每个值并为我想要使用默认值的参数传递“-1”。

第二种方法如下:

def compareNfilesParameters(*args, par1 = 10, par2 = 15 ..)

但是这样我需要调用如下函数:

compareNfilesParameters(path1, path2, path3, par1 = 10)

不喜欢

compareNfilesParameters(path1, path2, path3, 10)

或者 10 将在 args 输入中被考虑,对吗?我不想使用这种方法,因为调用该函数会变得非常冗长。

你会怎么做?

【问题讨论】:

  • 如果您提供默认值,如果您不想更改默认值,则无需向函数传递任何内容。例如,如果您执行了def foo(a, b, c=10),如果您不想更改c 的值,则可以使用foo(a, b) 调用该函数。
  • 简单地使用将所有路径保存为列表或元组的参数以及所有其他参数是可选的怎么样?喜欢compareNfilesParameters(files, *args)

标签: python pointers optional-parameters


【解决方案1】:

让用户以序列的形式传入文件名;不要试图将所有内容都塞进单独的参数中:

def compareNfilesParameters(files, *params):

并将其称为:

compareNfilesParameters(('a.vcf', 'b.vcf', 'c.vcf'), 0, 1, 4)

这使文件显式,并消除了将文件与其他参数分开的需要。

如果您剩余的参数是不同的选项(而不是一系列同质整数),我会使用关键字参数:

def compareNfilesParameters(files, op1=default_value, op2=default_value, op3=default_value):

你没有在调用时将关键字参数与关键字一起使用;您仍然可以将它们视为位置:

compareNfilesParameters(('a.vcf', 'b.vcf', 'c.vcf'), 0, 1, 4)

会给op10op21op34。只有当您想乱序指定值或为特定选项指定值时,您才必须在调用中使用关键字参数:

compareNfilesParameters(('a.vcf', 'b.vcf', 'c.vcf'), op3=4)

【讨论】:

  • 好的,假设我添加了这个。如果我只想指定第三个参数,我应该如何调用该函数?在函数中,我如何理解我得到的参数是指那个特定的参数?
  • @lateralus:您的问题对这些可选参数不清楚;它们是一系列同质数还是特定参数?如果是后者,使用关键字参数,它们也可以用作位置参数,除非你省略一些。
【解决方案2】:

好的,我按照建议使用关键字参数解决了。

def compareNfilesParameters(listFiles, **kwargs):
    start_time = time.time()

    if len(listFiles) < MINUMUM_FILES_NUMBER :
        print "You need to specify at least "+ str(MINUMUM_FILES_NUMBER) +" files."
        return

    try:
        operationType = int(kwargs.get("op", DEFAULT_OPERATION_TYPE))
    except ValueError:
        print "Operation type filter has to be an integer."
        return    
    if operationType not in [0,1]:
        print "Operation type must be 0 (intersection), 1 (union)"
        return

所有参数以此类推。 像这样,我需要将所有文件路径放在一个列表中并将其作为单个必需参数传递,并在 kwargs 字典中搜索可选项参数,如果未表示,则设置默认值。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多