关键字参数中的引用参数
Reference argument in keyword argument
有什么方法可以使用参数的值来动态设置关键字参数的默认值吗?我在想这样的事情:
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
但我希望有一个更优雅的解决方案。有人可以帮忙吗?
Is there any way to use the value of an argument to dynamically set the default of a keyword argument?
很遗憾没有。这可以用一个更简单的例子来说明:
>>> 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)
默认参数在定义时计算,而不是在调用函数时计算。因此,其他参数尚不清楚,无法引用。您可以使用以下常见模式实现所需的行为:
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
But I am hoping for a more elegant solution. Can anybody help?
怎么样
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
在这种情况下,我认为我们必须应用简单胜于复杂的原则,为什么不这样做:
def foo(lst, r = 0):
print r, len(lst)
正所谓Python没有办法为所欲为,仅此而已...
有什么方法可以使用参数的值来动态设置关键字参数的默认值吗?我在想这样的事情:
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
但我希望有一个更优雅的解决方案。有人可以帮忙吗?
Is there any way to use the value of an argument to dynamically set the default of a keyword argument?
很遗憾没有。这可以用一个更简单的例子来说明:
>>> 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)
默认参数在定义时计算,而不是在调用函数时计算。因此,其他参数尚不清楚,无法引用。您可以使用以下常见模式实现所需的行为:
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
But I am hoping for a more elegant solution. Can anybody help?
怎么样
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
在这种情况下,我认为我们必须应用简单胜于复杂的原则,为什么不这样做:
def foo(lst, r = 0):
print r, len(lst)
正所谓Python没有办法为所欲为,仅此而已...