根据另一个参数的值设置一个参数的默认值

Sets the default value of a parameter based on the value of another parameter

所以我想创建一个函数,生成从 'start' 到 'end' 与 'size' 一样多的连续数字。对于迭代,它将在函数内部计算。但是我在设置参数 'end' 的默认值时遇到问题。在我进一步解释之前,这里是代码:

# Look at this -------------------------------
#                                           ||
#                                           \/
def consecutive_generator(size=20, start=0, end=(size+start)):
    i = start
    iteration = (end-start)/size

    arr = []
    temp_size = 0

    while temp_size < size:
        arr.append(i)

        i += iteration
        temp_size += 1

    return arr

# with default end, so the 'end' parameter will be 11
c1= consecutive_generator(10, start=1)
print(c1)

# with end set
c2= consecutive_generator(10, end=20)
print(c2)


上面可以看出(关于'end'参数的默认值),我要实现的是'end'参数,默认值为'start' + 'size'参数(那么迭代次数为1)

输出肯定是错误的。那我该怎么做呢? (这是我第一次在 Whosebug 上提问,如果我弄错了请见谅)

这是一个非常标准的模式:

def consecutive_generator(size=20, start=0, end=None):
   if end is None:
       end = size + start

根据Python的document

Default parameter values are evaluated from left to right when the function definition is executed.

所以参数的默认值无法从函数调用时传递的其他动态值中计算出来。

您应该使用 None 等可区分的值作为默认值。然后您可以检查它并动态评估适当的默认值。例如,

def consecutive_generator(size=20, start=0, end=None):
    if end is None:
        end = size + start
    ...

如果你需要None作为调用方传递的有效值,你可以使用其他对象或其他东西来区分有效值。

default_end = object()
def consecutive_generator(size=20, start=0, end=default_end):
    if end is default_end:
        end = size + start
    ...

默认方式如 Samwise 所说,但有一个替代解决方案可能同样有效。

def consecutive_generator(size=20, start=0, **kwargs):
   end = kwargs.get('end', size+start)

此方法允许您在 end 存在时获取它,或者在它不存在时简单地设置 end 的值。

要调用它,如果您想将其设置为默认值以外的参数,则此方法确实要求函数调用具有指定的参数 end

consecutive_generator(20, 0, end=50)

dict.get

也许可以考虑查看 range and numpy.linspace

的文档