2017-09-05 20 views
1

Y a-t-il un moyen de compter le réel nombre d'arguments passés à une fonction dans python, même lorsque certaines valeurs par défaut sont définies? J'essaie d'écrire une fonction, qui remplace une certaine plage d'un fichier texte avec 0 (ou une valeur de décalage), mais cela ne fonctionne pas car python renvoie le nombre d'arguments, y compris les arguments qui ne sont pas passés.Comptage du nombre réel d'arguments dans python

Le fichier d'entrée est comme ceci:

foo.txt

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 

Voici le code:

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) 

... Cela ne fonctionne que lorsque le 3ème argument de la 'fin' est passé. Sans le 3ème argument, de 4 à la fin (11) sont censés être remplacés par 0. Mais, en réalité, de 4 à 9 sont remplacés par 0.

J'ai mis à contrecœur une valeur par défaut (= 10) fin, sinon le compilateur me donne l'erreur suivante:

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

Alors, comment voulez-vous résoudre ce problème? S'il vous plaît ne me dites pas de vérifier la longueur du fichier d'abord, puis donnez-le à la fonction. Cela devrait être fait à l'intérieur de la fonction. Dans MATLAB, 'nargin' renvoie le nombre réel d'arguments, donc ce type de logique fonctionnerait facilement. Si python ne peut pas faire ça, ça va être une honte.

+1

Si tout ce que vous voulez faire est de définir 'end' être égal à' length_Z' si aucun argument n'a été fourni pour 'end', puis peut » t vous utilisez simplement une valeur par défaut de 'None' et avez' if end est None: end = length_Z'? – Kevin

Répondre

2

Il suffit d'utiliser None comme valeur par défaut pour end:

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