2017-09-05 71 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 
    ...