首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python3装饰器来重用函数而不是修改自己?

如何使用Python3装饰器来重用函数而不是修改自己?
EN

Stack Overflow用户
提问于 2022-07-28 04:46:24
回答 2查看 73关注 0票数 1

我在一个类中有一些用于计算的函数。这些函数都采用一个参数,即句号,这是int所必需的。

我希望使用一个装饰符,以便当我为该参数输入Listint时,它可以被解释为将该值作为参数,并对该列表中的所有值执行函数。

由于这个装饰符可以用在带有关键字参数的其他函数上,所以我必须在装饰器输入中包含*kwargs。我使用了以下参考代码:

代码语言:javascript
复制
from typing import List

def multiple_para(func):
    def wrapper(_, period, *args, **kw):  # Since the first argument must be self, use _ instead
        results = []
        if isinstance(period, List):
            for i in period:
                result.append(func(_, period=i, *args, **kw))
        else:
            result = func(_, period=period, *args, **kw)
        return result
    return wrapper

class Test():
    @multiple_para
    def test(self, period: int, target: str = ''):
        output = period + 1  # substitute calculation process
        return output

if __name__ == '__main__':
    test1 = Test()
    test1.test(period=[1, 2, 3])

但是,我收到以下错误消息:

TypeError: test()获得了参数‘句号’的多个值

EN

回答 2

Stack Overflow用户

发布于 2022-07-28 07:25:38

这部分不像你期望的那样起作用。

代码语言:javascript
复制
for i in period:
    return func(_, period=i, *args, **kw)

for循环中,只对第一个值调用一次return

当您接收一个列表作为输入时,返回一个列表也是合理的。

像这样的东西应该能起作用

代码语言:javascript
复制
result = []
for i in period:
    result.append(func(_, period=i, *args, **kw))
return result

或者更短的版本

代码语言:javascript
复制
return [func(_, period=value, *args, **kw) for value in period]
票数 2
EN

Stack Overflow用户

发布于 2022-07-28 07:35:58

我认为这在概念上是合理的,因为您避免了每个可能接收标量或列表的函数的重复逻辑。它还将使以后的代码更易于与其他集合一起使用。

最后,您要做的是一个功能组合,比如在数学中应用g(f(x)),它非常好,这是在功能程序设计上广泛使用的一种技术,最后是装饰师的目的。

实现中有一个小错误,因为:

代码语言:javascript
复制
return func(_, period=i, *args, **kw)

将该函数仅应用于集合的第一个元素,然后返回结果,我相信您希望返回一个包含所有结果的列表。

此外,在定义装饰器时,您可能希望使用functools.wraps()来避免使用一些锅炉板。

一种(旧风格的)替代方法是有一个类,其方法区分集合和标量,并调用抽象方法,并让这个抽象方法在继承它的类中实现,但是这很麻烦,并且在基类和继承它的类之间创建了一个"Is-A“关系,这是人为的。所以总的来说,这是一个更好的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73147400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档