我在一个类中有一些用于计算的函数。这些函数都采用一个参数,即句号,这是int所必需的。
我希望使用一个装饰符,以便当我为该参数输入Listint时,它可以被解释为将该值作为参数,并对该列表中的所有值执行函数。
由于这个装饰符可以用在带有关键字参数的其他函数上,所以我必须在装饰器输入中包含*kwargs。我使用了以下参考代码:
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()获得了参数‘句号’的多个值
发布于 2022-07-28 07:25:38
这部分不像你期望的那样起作用。
for i in period:
return func(_, period=i, *args, **kw)在for循环中,只对第一个值调用一次return。
当您接收一个列表作为输入时,返回一个列表也是合理的。
像这样的东西应该能起作用
result = []
for i in period:
result.append(func(_, period=i, *args, **kw))
return result或者更短的版本
return [func(_, period=value, *args, **kw) for value in period]发布于 2022-07-28 07:35:58
我认为这在概念上是合理的,因为您避免了每个可能接收标量或列表的函数的重复逻辑。它还将使以后的代码更易于与其他集合一起使用。
最后,您要做的是一个功能组合,比如在数学中应用g(f(x)),它非常好,这是在功能程序设计上广泛使用的一种技术,最后是装饰师的目的。
实现中有一个小错误,因为:
return func(_, period=i, *args, **kw)将该函数仅应用于集合的第一个元素,然后返回结果,我相信您希望返回一个包含所有结果的列表。
此外,在定义装饰器时,您可能希望使用functools.wraps()来避免使用一些锅炉板。
一种(旧风格的)替代方法是有一个类,其方法区分集合和标量,并调用抽象方法,并让这个抽象方法在继承它的类中实现,但是这很麻烦,并且在基类和继承它的类之间创建了一个"Is-A“关系,这是人为的。所以总的来说,这是一个更好的方法。
https://stackoverflow.com/questions/73147400
复制相似问题