控制函数中返回的变量数

时间:2018-04-13 15:34:05

标签: python python-3.x return idl-programming-language multiple-variable-return

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

x,_,_ = function()

或者

x,y,_ = function()

甚至延长拆包:

x, *_ = function()

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

答案 2 :(得分:0)

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

答案 3 :(得分: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()