我是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输入中考虑,对吗?我不想使用这种方法,因为调用函数变得非常冗长。
你会怎么做?
答案 0 :(得分:3)
让用户将文件名作为序列传递;不要试图把所有东西塞进不同的论点中:
>>> np.array(y)[np.searchsorted(y, X)]
array([[ 1. , 3. , 3. ],
[ 0.5, 3. , 1. ],
[ 5. , 1. , 3. ]])
并将其称为:
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)
提供值op1
,0
为值op2
,1
为值op3
。只有当您想要指定不按顺序的值或特定选项时,您才必须在调用中使用关键字参数:
4
答案 1 :(得分:0)
好的,我解决了使用建议的关键字参数。
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字典中搜索选项参数,如果不表达则设置默认值。