计算 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
   ...