有没有办法定义一个函数,该函数根据用户期望的输出数量知道要返回多少变量?
让我来说明一下这个想法。假设以下函数:
def function():
a = 1
b = 2
c = 3
return a, b, c
然后,我希望我的函数表现如下:
>>> x = function()
>>> x
1
>>> x, y = function()
>>> x
1
>>> y
2
>>> x, y, z = function()
>>> x
1
>>> y
2
>>> z
3
python 中是否有一个函数或概念可以帮助我实现这一目标?也许是装饰师?
欢迎任何想法!
PD:我的Python水平仍然非常基础。
编辑:
我目前正在从IDL转向Python。所以我缺少 IDL 中的一个很好的功能,您实际上可以选择通过执行以下操作来返回任意数量的变量:
FUNCTION function, a=a, b=b, c=c
a=1
b=2
c=3
RETURN, a
然后你可以简单地问你想得到什么
IDL> x=function()
IDL> print, x
1
IDL> x=function(y=b)
IDL> print, x
1
IDL> print, y
2
IDL> x=function(y=b, z=c)
IDL> print, x
1
IDL> print, y
2
IDL> print, c
3
与其返回不同的值,不如以不同的方式调用它:
x, *_ = function()
x, y, *_ = function()
x, y, z, *_ = function() # *_ is optional here if it only returns 3 things
这样做会将所有未使用的返回值分配给 _
变量,因此如果您希望它们尽早获得 gc'd,则必须del _
.
您只能返回单个对象。请注意,您的函数返回一个tuple
。但是,Python 支持允许您灵活解压缩变量的语法
x,_,_ = function()
或
x,y,_ = function()
甚至延长开箱时间:
x, *_ = function()
请注意,使用 _
作为一次性变量只是一个约定。
除了像检查调用者的字节码以查看它期望多少值这样的疯狂技巧之外,这是不可能的:解释器不会接受任何不匹配数量的值(它会检查并捕获额外的值(。
虽然不像解包那样 Pythonic,但您可以创建一个装饰器并指定允许的返回值数:
def filter_results(val):
def outer(f):
def wrapper(*args, **kwargs):
v = f(*args, **kwargs)[:val]
return v[0] if len(v) == 1 else v
return wrapper
return outer
@filter_results(1)
def function():
a = 1
b = 2
c = 3
return a, b, c
r = function()
输出:
1
完整结果:
@filter_results(2)
def function():
...
x, y = function()
最后:
@filter_results(3)
def function():
...
x, y, z = function()