有没有办法将默认参数设置为等于另一个参数值?

Cop*_*Run 19 python python-3.x

例如,我有一个基本方法,它将返回一个排列列表.

import itertools
def perms(elements, set_length=elements):
    data=[]
    for x in range(elements):
        data.append(x+1)
    return list(itertools.permutations(data, set_length))
Run Code Online (Sandbox Code Playgroud)

现在我理解,在当前状态下,这段代码不会运行,因为第二段elements没有定义,但是有没有优雅的方法来完成我在这里尝试做的事情?如果仍然不清楚,我想使默认setLength值等于传入的第一个参数.谢谢.

Mar*_*ers 25

不,函数关键字参数默认值是在定义函数时确定的,而不是在执行函数时确定的.

将默认值设置为None并检测:

def perms(elements, setLength=None):
    if setLength is None:
        setLength = elements
Run Code Online (Sandbox Code Playgroud)

如果您需要能够指定None为参数,请使用不同的sentinel值:

_sentinel = object()

def perms(elements, setLength=_sentinel):
    if setLength is _sentinel:
        setLength = elements
Run Code Online (Sandbox Code Playgroud)

现在调用者可以设置setLengthNone,它不会被视为默认值.


Jon*_*nts 6

由于Python处理绑定和默认参数的方式......

标准方式是:

def perms(elements, setLength=None):
    if setLength is None:
        setLength = elements
Run Code Online (Sandbox Code Playgroud)

另一种选择是:

def perms(elements, **kwargs):
    setLength = kwargs.pop('setLength', elements)
Run Code Online (Sandbox Code Playgroud)

虽然这需要您明确使用,perms(elements, setLength='something else')如果您不想要默认...


Syl*_*inD 5

你应该做的事情如下:

def perms(elements,setLength=None):
    if setLength is None:
        setLength = elements
Run Code Online (Sandbox Code Playgroud)