在python

时间:2017-09-05 15:13:10

标签: python parameters arguments signature

有没有办法计算传递给python函数的真实参数数量,即使设置了一些默认值?我正在尝试编写一个函数,它用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)

...仅当第3个参数结束时才有效。通过。没有第三个参数,从4到结尾(11)应该被替换为0.但是,实际上,从4到9被替换为0.

我不情愿地设置一个默认值(= 10)结束,否则编译器会给我以下错误:

  

TypeError:substitute_with()缺少1个必需的位置参数:&#39; end&#39;

那么,你们怎么解决这个问题呢?请不要告诉我先检查文件的长度,然后将其交给函数。它应该在函数内部完成。在MATLAB中,&#39; nargin&#39;返回实数的参数,因此这种逻辑很容易。如果python不能做到这一点,那将是一种耻辱。

1 个答案:

答案 0 :(得分:2)

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

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