2017-09-05 68 views
1

有什么办法可以计算实数在python中传递给函数的参数数量,即使设置了一些默认值?我试图编写一个函数,该函数用0(或偏移值)替换文本文件的某个范围,但它不起作用,因为python返回包含未传递参数的参数数量。计算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) 

...这只有当第三个参数 '端'已通过。没有第三个参数,从4到结尾(11)应该被替换为0.但是,实际上,从4到9被替换为0.

我很不情愿地设置了默认值(= 10)最终,否则编译器给了我以下错误:

TypeError: substitute_with() missing 1 required positional argument: 'end'

那么,如何将你们解决这个问题?请不要告诉我先检查文件的长度,然后将其提供给函数。它应该在函数内完成。在MATLAB中,'nargin'返回参数的实数,所以这种逻辑很容易工作。如果python无法做到这一点,这将是一个耻辱。

+1

如果你想要做的就是设置'如果没有参数是为'end'提供end'等于'length_Z',然后可以”你只是使用'None'的默认值并且如果end是None:end = length_Z'? – Kevin

回答

2

只需使用None作为默认end

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