如评论中所提到的,最好的方法是让您的函数返回一个常数数量的值,并且如果您的用例实际上更复杂(例如参数解析),请使用库进行处理。
然而,您的问题明确要求一种处理返回可变数量参数的 Pythonic 方法,我认为可以通过
装饰器 来干净地完成。它们并不是非常常见,大多数人倾向于更多地使用它们而不是创建它们,因此这里有一个
关于创建装饰器的平易近人的教程,以了解更多信息。
下面是一个装饰函数,它可以完成您要查找的功能。该函数返回一个带有可变数量参数的迭代器,并且它会填充到一定长度以更好地适应迭代器拆包。
def variable_return(max_values, default=None):
def decorator(f):
def wrapper(*args, **kwargs):
actual_values = f(*args, **kwargs)
try:
actual_values = list(actual_values)
except:
actual_values = [actual_values]
extra = [default] * (max_values - len(actual_values))
actual_values.extend(extra)
return actual_values
return wrapper
return decorator
@variable_return(max_values=3)
def ret_n(n):
return list(range(n))
a, b, c = ret_n(1)
print(a, b, c)
a, b, c = ret_n(2)
print(a, b, c)
a, b, c = ret_n(3)
print(a, b, c)
这将输出您要查找的内容:
0 None None
0 1 None
0 1 2
装饰器基本上获取被装饰的函数并返回它的输出结果,再附加足够的额外值来填充"max_values"。调用者可以假设该函数始终返回确切地"max_values"数量的参数,并像平常一样使用高级解包。
argparse
,它还会为您生成有用的帮助信息,或者类似于click
的东西。 - jonrsharpeargparse
更适合解析参数,否则这真的取决于情况。您可以使用带有默认值的iter()
和next()
,或者在其周围包装器,或协程,或填充默认值的函数,或... - Ry-