控制函数中返回的变量数

问题描述 投票:1回答:4

有没有办法定义一个函数,它根据用户期望的输出数知道要返回多少变量?

让我说明一下这个想法。假设以下功能:

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
python python-3.x return idl-programming-language multiple-variable-return
4个回答
3
投票

您可以不同地调用它,而不是返回不同的值:

x, *_ = function()
x, y, *_ = function()
x, y, z, *_ = function()   # *_ is optional here if it only returns 3 things

这样做会将所有未使用的返回值分配给_变量,因此如果您希望它们尽早获得gc'd,则必须使用del _


1
投票

您只能返回单个对象。注意,你的函数返回一个tuple。但是,Python支持的语法允许您灵活地解压缩变量

x,_,_ = function()

要么

x,y,_ = function()

或者甚至延长拆包:

x, *_ = function()

注意,使用_作为一次性变量仅仅是一种惯例。


0
投票

如果没有疯狂的技巧,比如检查调用者的字节码以查看它所期望的值,这是不可能的:解释器不会接受任何不匹配的值(它会检查和捕获额外的值)。


0
投票

虽然不像解包那样是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()
© www.soinside.com 2019 - 2024. All rights reserved.