为关键字参数设置默认值时可以引用位置参数吗?
Can you reference positional arguments when setting default values for keyword arguments?
我正在编写一个辅助 python 函数,它将两个列表作为参数并迭代它们。通常第二个列表需要是一个长度与第一个相同的零数组。我想将第二个列表设置为关键字参数并为其分配默认值。
def iterate(list_a, list_b = np.zeros((len(list_a),), dtype=int)):
for a, b in zip(list_a, list_b):
# do something with a and b
但是报错list_a is not defined,提示定义函数时不能在括号内进行自引用计算。一个明显的解决方案是为 list_b 选择一个特殊的默认值,如果在调用函数时保持不变,则使用 if 语句将其更改为零列表:
def iterate(list_a, list_b = 'zeros'):
if list_b == 'zeros':
list_b = np.zeros((len(list_a),), dtype=int)
for a, b in zip(list_a, list_b):
# do something with a and b
这个解决方案对我来说似乎不是很 pythonic,我想知道是否有更好的做法。
我故意保持它的通用性,但如果需要,我可以提供有关我的功能的更多详细信息。
不,这做不到,但你已经按常规方式基本解决了问题。
通常在这种情况下,人们会将默认值设置为 None
并做同样的事情(只是因为这对于键入和 linting 来说不那么奇怪 - 该函数接受数组或什么都不接受,而不是数组或字符串。 )
在可用性方面,您可以告诉用户默认值在 doc 脚本中有效地做什么。
def iterate(list_a, list_b=None):
'list_b defaults to zero array of size a'
if not list_b:
list_b = np.zeros((len(list_a),), dtype=int)
for a, b in zip(list_a, list_b):
# do something with a and b
不可能的原因是当您在同一行中调用它时 list_a
变量尚未创建,因为 python 解释器逐行进行。
我正在编写一个辅助 python 函数,它将两个列表作为参数并迭代它们。通常第二个列表需要是一个长度与第一个相同的零数组。我想将第二个列表设置为关键字参数并为其分配默认值。
def iterate(list_a, list_b = np.zeros((len(list_a),), dtype=int)):
for a, b in zip(list_a, list_b):
# do something with a and b
但是报错list_a is not defined,提示定义函数时不能在括号内进行自引用计算。一个明显的解决方案是为 list_b 选择一个特殊的默认值,如果在调用函数时保持不变,则使用 if 语句将其更改为零列表:
def iterate(list_a, list_b = 'zeros'):
if list_b == 'zeros':
list_b = np.zeros((len(list_a),), dtype=int)
for a, b in zip(list_a, list_b):
# do something with a and b
这个解决方案对我来说似乎不是很 pythonic,我想知道是否有更好的做法。
我故意保持它的通用性,但如果需要,我可以提供有关我的功能的更多详细信息。
不,这做不到,但你已经按常规方式基本解决了问题。
通常在这种情况下,人们会将默认值设置为 None
并做同样的事情(只是因为这对于键入和 linting 来说不那么奇怪 - 该函数接受数组或什么都不接受,而不是数组或字符串。 )
在可用性方面,您可以告诉用户默认值在 doc 脚本中有效地做什么。
def iterate(list_a, list_b=None):
'list_b defaults to zero array of size a'
if not list_b:
list_b = np.zeros((len(list_a),), dtype=int)
for a, b in zip(list_a, list_b):
# do something with a and b
不可能的原因是当您在同一行中调用它时 list_a
变量尚未创建,因为 python 解释器逐行进行。