【问题标题】:Counting the real number of arguments in python计算python中的实数参数
【发布时间】:2017-09-05 15:13:10
【问题描述】:

是否有任何方法可以计算传递给 python 中函数的 real 参数的数量,即使设置了一些默认值?我正在尝试编写一个函数,它将文本文件的某个范围替换为 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)

... 这仅在传递第三个参数“end”时有效。如果没有第三个参数,从 4 到结尾 (11) 应该被替换为 0。但实际上,从 4 到 9 被替换为 0。

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

TypeError:substitute_with() 缺少 1 个必需的位置参数:'end'

那么,你们将如何解决这个问题?请不要告诉我先检查文件的长度,然后再将其交给函数。它应该在函数内部完成。在 MATLAB 中,“nargin”返回参数的实数,因此这种逻辑很容易工作。如果python不能做到这一点,那就太可惜了。

【问题讨论】:

  • 如果您只想将end 设置为等于length_Z,如果没有为end 提供参数,那么您不能只使用默认值None并有if end is None: end = length_Z?

标签: python parameters arguments signature


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2022-01-01
    • 1970-01-01
    • 2017-12-23
    • 2015-01-12
    相关资源
    最近更新 更多