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

计算python中实数个参数

计算python中实数个参数,python,parameters,arguments,signature,Python,Parameters,Arguments,Signature,是否有任何方法可以计算python中传递给函数的real参数数,即使设置了一些默认值?我试图编写一个函数,用0(或偏移量值)替换文本文件的某个范围,但它不起作用,因为python返回的参数数量包括未传递的参数 输入文件如下所示: foo.txt 代码如下: import os import numpy as np from inspect import signature def substitute_with(FILE, start, end=10, offset=0): sig

是否有任何方法可以计算python中传递给函数的real参数数,即使设置了一些默认值?我试图编写一个函数,用0(或偏移量值)替换文本文件的某个范围,但它不起作用,因为python返回的参数数量包括未传递的参数

输入文件如下所示:

foo.txt 代码如下:

import os
import numpy as np
from inspect import signature

def substitute_with(FILE, start, end=10, offset=0):

    sig = signature(substitute_with)
    params = sig.parameters
    print('len(params): %d' % len(params))

    filename, file_extension = os.path.splitext(FILE)  
    file_i = FILE
    file_o = filename + '_0' + file_extension

    Z = np.loadtxt(file_i)

    with open(file_o, "w") as fid:
        length_Z = len(Z)
        print('length_Z: %d' % length_Z)

        if(len(params) < 3): # gives me 4, but actually, I need 2 here!
            end=length_Z

        X = np.concatenate([np.ones((start)), np.zeros((end-start)), np.ones((length_Z-end))])
        Y = np.concatenate([np.zeros((start)), np.ones((end-start)), np.zeros((length_Z-end))])*offset

        A=Z.T*X+Y

        for i in range(0, length_Z):
            fid.write('%d\n' % (A[i]))

#substitute_with('foo.txt',4,8)
#substitute_with('foo.txt',4,8,2)
substitute_with('foo.txt',4)
导入操作系统
将numpy作为np导入
请检查进口签名
def替换_为(文件,开始,结束=10,偏移=0):
sig=签名(用替换_)
params=sig.parameters
打印('len(params):%d'%len(params))
文件名,文件扩展名=os.path.splitext(文件)
file_i=file
file_o=文件名+''u 0'+文件扩展名
Z=np.loadtxt(文件i)
打开(文件“w”)作为fid:
长度_Z=len(Z)
打印('length\u Z:%d'%length\u Z)
如果(len(params)<3):#给我4,但实际上,我这里需要2!
结束=长度_Z
X=np.连接([np.一((开始)),np.零((结束-开始)),np.一((长度Z-end)))
Y=np.连接([np.零((开始)),np.一((结束-开始)),np.零((长度Z-end)))*offset
A=Z.T*X+Y
对于范围内的i(0,长度_Z):
fid.write(“%d\n%”(A[i]))
#将_替换为('foo.txt',4,8)
#将_替换为('foo.txt',4,8,2)
将_替换为('foo.txt',4)
。。。这仅在传递第三个参数“end”时有效。如果没有第3个参数,则从4到结尾(11)应替换为0。但是,在现实中,从4到9被替换为0

我不情愿地将默认值(=10)设置为end,否则编译器会给出以下错误:

TypeError:用()替换_缺少1个必需的位置参数:“end”


你们怎么解决这个问题?请不要告诉我先检查文件的长度,然后再将其交给函数。它应该在函数内部完成。在MATLAB中,“nargin”返回实数个参数,因此这种逻辑很容易工作。如果python不能做到这一点,那就太可惜了。

只需使用
None
作为
end
的默认值:

def substitute_with(FILE, start, end=None, offset=0):
   ...
   if end is None:
        end = length_Z
   ...

如果您只想将
end
设置为等于
length_Z
如果没有为
end
提供参数,那么您就不能使用默认值
None
,如果end为None:end=length_Z?
def substitute_with(FILE, start, end=None, offset=0):
   ...
   if end is None:
        end = length_Z
   ...