首页 > 解决方案 > python timer decorator - 函数对我放入参数的原始数据集生效

问题描述

我对 python 装饰器比较陌生。

我有这个装饰器功能。

def myTimer(func):
    def wrapper(*args, **kargs):
      t1 = time.time()
      result = func(*args, **kargs)
      t2 = time.time() - t1
      print('Execution Time (function : {}) : {} sec'.format(func.__name__, t2))
      return result

    return wrapper

这只是一个定时器功能。而且,我有一种方法可以根据另一列添加一列。

@myTimer
def createID(dat):
    dat['new'] = dat.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
    return dat

这会生成一个新列,其值只是由“_”分隔符组合的另一列值。

现在,如果我定义上面的两个函数并在下面运行,

tdat2 = createID(tdat)

然后 tdat2 正确返回,但更改也对 tdat(原始数据集)生效。我的意思是,tdat 首先有 30 列,而 tdat2 应该有 31 列,这很好,但 tdat 也有新列。

有什么办法可以解决这个问题吗?我在下面尝试过,它对我来说很好,但是由于代码约定等原因,我希望参数和返回值相同('dat')。

@myTimer
def createID2(dat):
    result = dat.copy()
    result['new'] = result.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
    return result

提前致谢。

标签: pythondecorator

解决方案


一些笔记

  1. 由于您没有类,createID因此称为函数。它是一个黑盒子:它接受输入,做某事并返回输出。在 Python 中,函数用小写字母和下划线编写,例如create_id.
  2. my_timer()也是一个包装了它所装饰的函数的函数,即create_id(). 除了打印一些东西(副作用)之外,您的装饰器实际上不会对您的包装函数做任何事情。

因此,装饰函数内部发生的任何事情都不受装饰器的影响。它所做的只是计算函数调用运行的速度。


您描述的突变问题是熊猫问题(请参阅View vs Copy文档)。你已经用.copy()方法解决了。


推荐阅读