【发布时间】:2017-09-05 15:13:10
【问题描述】:
是否有任何方法可以计算传递给 python 中函数的 real 参数的数量,即使设置了一些默认值?我正在尝试编写一个函数,它将文本文件的某个范围替换为 0(或偏移值),但它不起作用,因为 python 返回参数的数量,包括未传递的参数。
输入文件是这样的:
foo.txt
0
1
2
3
4
5
6
7
8
9
10
11
代码如下:
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)
... 这仅在传递第三个参数“end”时有效。如果没有第三个参数,从 4 到结尾 (11) 应该被替换为 0。但实际上,从 4 到 9 被替换为 0。
我不情愿地设置了一个默认值(=10)结束,否则编译器给我以下错误:
TypeError:substitute_with() 缺少 1 个必需的位置参数:'end'
那么,你们将如何解决这个问题?请不要告诉我先检查文件的长度,然后再将其交给函数。它应该在函数内部完成。在 MATLAB 中,“nargin”返回参数的实数,因此这种逻辑很容易工作。如果python不能做到这一点,那就太可惜了。
【问题讨论】:
-
如果您只想将
end设置为等于length_Z,如果没有为end提供参数,那么您不能只使用默认值None并有if end is None: end = length_Z?
标签: python parameters arguments signature