Python装饰一代

2024-09-29 00:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同版本的函数;它读取一个大文件(我在这里使它变得简单,并读取一个非常小的excel文件)。在

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

我想装饰这两个函数的输出,并根据不同的逻辑在每行的末尾添加一些内容,这就是为什么我认为我需要一个不同的定制装饰器。但是我不知道怎样才能在装饰师的帮助下实现它?尤其是当我有收益而不是回报的时候。在

版本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:

^{pr2}$

假设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函数应该是什么?在


Tags: 文件函数版本indexversionsh装饰out
1条回答
网友
1楼 · 发布于 2024-09-29 00:16:22

{或者说,对于第二个函数来说,对于一个新的结果,假设这个函数的结果是。有了这些知识,我们可以继续做一个装饰工,比如

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

(在这里,我使用^{}来帮助维护装饰函数的一些元数据(不需要从功能角度考虑),并作为编写示例的指南)

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

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


作为一个旁注,因为你的2函数做同样的事情,我宁愿保留生成器,当我需要一个列表调用list(readxls())时,我也会在函数签名中添加两个额外的变量,并使用默认值这些字符串使函数更灵活。在

相关问题 更多 >