关键字参数中的引用参数

问题描述 投票:1回答:4

有没有办法使用参数的值来动态设置关键字参数的默认值?我在考虑这样的事情:

def foo(lst, r = 0, l = len(lst)):    #I am referring to the "l = len(lst)" part
    print r, l


foo([1,2,3])

这给出了以下回溯:

Traceback (most recent call last):
  File "C:/Python27/quicksort.py", line 25, in <module>
    def foo(lst, r = 0, l = len(lst)):
NameError: name 'lst' is not defined

人们可以做类似的事情:

def foo(lst, r = 0, l = None):
    if l is None:
        l = len(lst)
    print r, l

但我希望有一个更优雅的解决方案。有人可以帮忙吗?

python parameter-passing keyword-argument
4个回答
1
投票

有没有办法使用参数的值来动态设置关键字参数的默认值?

很不幸的是,不行。这可以通过一个更简单的示例来显示:

>>> def func(a, b=a):
    return a, b

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    def func(a, b=a):
NameError: name 'a' is not defined

如注释中所述,Python关键字参数值在定义函数时进行评估,但在调用函数之前不知道任何参数的值。因此,Python中的这样的东西根本不可行。

但是,您可以使用三元运算符使代码更紧凑:

def foo(lst, r=0, l=None):
    l = l if l is not None else len(lst)
    print(r, l)

1
投票

默认参数在定义时评估,而不是在调用函数时评估。因此,其他参数尚未知,也无法参考。您可以使用以下常见模式实现所需的行为:

def foo(lst, r=0, l=None):    
    if l is None:
        l = len(lst)
    # or shorter
    # l = len(lst) if l is None else l
    # or even shorter
    # l = (l, len(lst))[l is None]
    print r, l

1
投票

但我希望有一个更优雅的解决方案。有人可以帮忙吗?

怎么样

def foo(lst, r=0, **kwargs):
    # Here we use `get`: dict.get(key, default = None)  
    print(r, kwargs.get('l', len(lst)))

def foo(lst, **kwargs):  
    print(kwargs.get('r', 0), kwargs.get('l', len(lst)))

def foo(lst, **kwargs):  
    r, l = kwargs.get('r', 0), kwargs.get('l', len(lst))
    print(r, l)

参考

*args and **kwargs? https://www.tutorialspoint.com/python/dictionary_get.htm


0
投票

在这种情况下,我认为我们必须应用原则简单比复杂更好,为什么不这样做:

def foo(lst, r = 0):
    print r, len(lst)

正如所说的那样,没有办法在Python中做你想做的事,就是所有......

© www.soinside.com 2019 - 2024. All rights reserved.