有没有办法在默认参数之后使用必需的参数? (比如默认的python range())
Is there a way to use required arguments after default arguments? (Like the default python range())
我正在编写一个 class 试图重新创建默认的 python 范围-class,但我意识到初始化的行为与平常有点不同。
通常函数所需的参数必须在默认参数前面 f.e.:
def foo(a, b, c='bar'):
return a, b, c
但在 range()
的情况下,您可以这样使用它。 range(start, stop, step)
。其中 stop
是唯一必需的参数。所以基本上:
print(list(range(5)))
print(list(range(2, 6)))
print(list(range(0, 10, 2)))
>>[0, 1, 2, 3, 4]
>>[2, 3, 4, 5, 6]
>>[0, 2, 4, 6, 8]
这是否意味着有一种方法可以让所需参数不必是第一个参数来编写函数?它的工作原理如何?我该如何重新创建它?
提前致谢!!!
当然有办法。如果不出意外,您可以这样做:
def foo(a, b = None, c = None ):
if not b and not c:
start = 0
stop = a
step = 1
elif not c:
start = a
stop = b
step = 1
else:
start = a
stop = b
step = c
print(f"{start = }, {stop = }, {step = }")
foo(2)
foo(1,2)
foo(1,2,3)
我正在编写一个 class 试图重新创建默认的 python 范围-class,但我意识到初始化的行为与平常有点不同。
通常函数所需的参数必须在默认参数前面 f.e.:
def foo(a, b, c='bar'):
return a, b, c
但在 range()
的情况下,您可以这样使用它。 range(start, stop, step)
。其中 stop
是唯一必需的参数。所以基本上:
print(list(range(5)))
print(list(range(2, 6)))
print(list(range(0, 10, 2)))
>>[0, 1, 2, 3, 4]
>>[2, 3, 4, 5, 6]
>>[0, 2, 4, 6, 8]
这是否意味着有一种方法可以让所需参数不必是第一个参数来编写函数?它的工作原理如何?我该如何重新创建它?
提前致谢!!!
当然有办法。如果不出意外,您可以这样做:
def foo(a, b = None, c = None ):
if not b and not c:
start = 0
stop = a
step = 1
elif not c:
start = a
stop = b
step = 1
else:
start = a
stop = b
step = c
print(f"{start = }, {stop = }, {step = }")
foo(2)
foo(1,2)
foo(1,2,3)