计算 python 中参数的实际数量
Counting the real number of arguments in python
有什么方法可以计算 实际 传递给 python 中的函数的参数数量,即使设置了一些默认值?我正在尝试编写一个函数,它用 0(或偏移值)替换文本文件的某个范围,但它不起作用,因为 python returns 参数数量包括未通过的参数。
输入文件是这样的:
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() missing 1 required positional argument: 'end'
那么,你们会如何解决这个问题?请不要告诉我先检查文件的长度,然后再将其交给函数。它应该在函数内部完成。在 MATLAB 中,'nargin' returns 参数的实数,因此这种逻辑很容易工作。如果python做不到,那就太可惜了。
只需使用 None
作为 end
的默认值:
def substitute_with(FILE, start, end=None, offset=0):
...
if end is None:
end = length_Z
...
有什么方法可以计算 实际 传递给 python 中的函数的参数数量,即使设置了一些默认值?我正在尝试编写一个函数,它用 0(或偏移值)替换文本文件的某个范围,但它不起作用,因为 python returns 参数数量包括未通过的参数。
输入文件是这样的:
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() missing 1 required positional argument: 'end'
那么,你们会如何解决这个问题?请不要告诉我先检查文件的长度,然后再将其交给函数。它应该在函数内部完成。在 MATLAB 中,'nargin' returns 参数的实数,因此这种逻辑很容易工作。如果python做不到,那就太可惜了。
只需使用 None
作为 end
的默认值:
def substitute_with(FILE, start, end=None, offset=0):
...
if end is None:
end = length_Z
...