gpt4 book ai didi

python - 装饰生成器

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:39 25 4
gpt4 key购买 nike

我有两个不同版本的函数;它读取一个大文件(我在这里简化并读取一个非常小的Excel文件)。

版本 1: 读取整个文件并返回行列表
版本 2: 在生成器的帮助下逐行读取

我想装饰这两个函数的输出,并根据不同的逻辑在每行的末尾添加一些内容,这就是为什么我认为我需要一个不同的自定义装饰器。但我不知道如何通过装饰器的帮助来实现它?特别是当我有 yield 而不是返回时。

版本1:

@dec
def readxls():
fileBook = xlrd.open_workbook('../decorator.xls')
sh = fileBook.sheet_by_name("Sheet1")
out = []
for row_index in xrange(1, sh.nrows):
out.append(sh.row_values(row_index))
return out

版本 2:

@dec2
def readxls():
fileBook = xlrd.open_workbook('../decorator.xls')
sh = fileBook.sheet_by_name("Sheet1")
for row_index in xrange(1, sh.nrows):
yield sh.row_values(row_index)

假设 Excel 文件如下:

Col1    Col2    Col3
Val11 Val12 Val13
Val21 Val22 Val23

我想装饰输出以获得以下结果:

Col1    Col2    Col3   0  Col1Col2
Val11 Val12 Val13 1 Val11Val12
Val21 Val22 Val23 2 Val21Val22

为了得到类似这样的输出,我的 dec1 和 dec2 函数应该如何?

最佳答案

装饰器应该工作,获取函数的结果,对其进行操作并给出新的结果,因此知道结果是什么是关键,在本例中,对于该示例,结果是 [['val11 ', 'val12', 'val13'], ['val21', 'val22', 'val23']] 对于版本 1,以及包含第二个版本元素的生成器。有了这些知识,我们就可以继续制作装饰器,例如

from functools import wraps

def decorator1(fun):
@wraps(fun)
def wrapper(*args,**kwds):
result = fun(*args,**kwds)
for i,x in enumerate(result,1):
x.extend( (i, x[0]+x[1]) )
return result
return wrapper

def decorator2(fun):
@wraps(fun)
def wrapper(*args,**kwds):
for i,x in enumerate(fun(*args,**kwds),1):
x.extend( (i, x[0]+x[1]) )
yield x
return wrapper

(这里我使用 wraps 来帮助维护装饰函数的一些元数据(不需要功能)并作为编写示例的指南)

在第一个装饰器中,由于结果是整个列表,我只需向每个元素添加额外的内容并返回它,在第二个装饰器中,我添加额外的内容,因为它们会维护生成器结构

用这些装饰,现在的结果是 [['val11', 'val12', 'val13', 1, 'val11val12'], ['val21', 'val22', 'val23', 2, 'val21val22']]

<小时/>

顺便说一句,因为你的 2 个函数做了同样的事情,所以我宁愿保留生成器,当我需要列表调用 list(readxls()) 时,我还会添加 2 个额外的函数函数签名中的变量带有默认值这些字符串,使函数更加灵活。

关于python - 装饰生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38900512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com