Python 如何使函数的返回值可调?

Python 如何使函数的返回值可调?,python,arrays,numpy,Python,Arrays,Numpy,我正在尝试编写一个能够处理各种数字和返回值类型的装饰器,但我在处理数字/数字的可重用性方面遇到了困难 假设我希望我的decorator对它所修饰的函数的每个返回值操作“+1”。我找到了这样做的方法,尽管我觉得它并不优雅(尤其是“try/except”块和“returntuple(x)if len(x)>1else x[0]”行): #加上一个装饰师 def加上一个装饰器(func): “”“为每个返回值添加一个的装饰器”“” def装饰(*args,**kwargs): 原始参数=函数(*arg

我正在尝试编写一个能够处理各种数字和返回值类型的装饰器,但我在处理数字/数字的可重用性方面遇到了困难

假设我希望我的decorator对它所修饰的函数的每个返回值操作“+1”。我找到了这样做的方法,尽管我觉得它并不优雅(尤其是“try/except”块和“returntuple(x)if len(x)>1else x[0]”行):

#加上一个装饰师
def加上一个装饰器(func):
“”“为每个返回值添加一个的装饰器”“”
def装饰(*args,**kwargs):
原始参数=函数(*args,**kwargs)
#使原材料适合(因为它可以是任何长度)
尝试:
原始分辨率=元组(原始分辨率)
除:
原始分辨率=[原始分辨率]
#创建列表以存储装饰输出
输出列表=[]
对于原始分辨率中的分辨率:
输出列表追加(res+1)
#Sugar不返回一个元组
如果len(output_list)>1,则返回元组(output_list)[0]
回报
#装饰func
dec_减号=加上一个装饰器(λx:-x)
dec_dbl_tpl=加上一个装饰器(λx:(x*2,x*3))
#检查
打印(dec_减去(1))#>>>0(如预期)
打印(12月dbl第三方物流(3))#>>>7、10(如预期)
这对普通数字有效,但如果我用numpy.ndarray怎么办

将numpy导入为np
foo=np.array([1,1,1])
打印(dec_减(foo))#>>>(0,0,0)(!应为数组([0,0,0]))
打印(dec_dbl_tpl(foo))#>>>(数组([3,3,3])、数组([4,4,4])(如预期)
对于返回元组的第二个函数,它确实按照预期工作,因为原始返回值已经是元组(因为元组((array_1,array_2))-->(array_1,array_2))。但是,ndarray
数组([0,0,0])
被转换成一个元组
(0,0,0)

最后,我的问题是:

当函数的返回值可以是不同数量和不同类型时,是否有一种优雅的方法使其可移植?

我想我可以测试每个返回值的类型,但它似乎不是很优雅

干杯是的,有

例如:

from collections.abc import Iterable
从复制导入deepcopy
...
#在你的装潢师
如果不存在(原始,可编辑):
原始分辨率=[原始分辨率]
输出=深度复制(原始分辨率)
对于i,枚举中的res(输出):
输出[i]=res+1
如果len(输出)>1,则返回输出,否则输出[0]
在您的示例中,您创建了一个名为
output\u list
的值列表,但您应该将所有数据复制到
output
,然后修改其中的数据