【问题标题】:Controlling the number of returned variables in a function控制函数中返回变量的数量
【发布时间】:2018-09-24 00:35:00
【问题描述】:

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

让我来说明这个想法。假设如下函数:

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你只能返回一个对象。请注意,您的函数返回一个tuple。但是,Python 支持的语法可以让您灵活地解包变量

    x,_,_ = function()
    

    或者

    x,y,_ = function()
    

    甚至扩展解包:

    x, *_ = function()
    

    注意,使用_ 作为一次性变量只是一种约定。

    【讨论】:

      【解决方案3】:

      没有一些疯狂的技巧,比如检查调用者的字节码以查看它需要多少值,这是不可能的:解释器不会接受任何不匹配数量的值(它会检查并捕获额外的值)。

      【讨论】:

        【解决方案4】:

        虽然不像解包那样 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()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-10
          • 1970-01-01
          • 2016-10-02
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多