Python 在装饰器的末尾修剪零元素

Python 在装饰器的末尾修剪零元素,python,python-decorators,Python,Python Decorators,为了更好地打印我的计算结果,我写了一个装饰师: 从functools导入包装 def打印显示(f): @包装(f) def包装(*args,**kwargs): 显示,显示标准=f(*args,**kwargs) 标签=(‘GD’、‘GDD’、‘TOD’、‘FOD’、‘QOD’) 对于枚举(zip(labels,disp,disp_std))中的i(label,disp_item,disp_std_item): 打印(f'{label}={disp_item:.5f}±{disp_std_ite

为了更好地打印我的计算结果,我写了一个装饰师:

从functools导入包装
def打印显示(f):
@包装(f)
def包装(*args,**kwargs):
显示,显示标准=f(*args,**kwargs)
标签=(‘GD’、‘GDD’、‘TOD’、‘FOD’、‘QOD’)
对于枚举(zip(labels,disp,disp_std))中的i(label,disp_item,disp_std_item):
打印(f'{label}={disp_item:.5f}±{disp_std_item:.5f}fs^{i+1}')
返回显示,显示标准
回程包装
可通过以下方式使用:

将numpy导入为np
@打印显示
def calc():
disp=np.array([1,0,7,0,0])
disp_std=np.数组([0.1,0,0.7,0,0])
返回显示,显示标准
它回来了

GD = 1.00000 ± 0.10000 fs^1
GDD = 0.00000 ± 0.00000 fs^2
TOD = 7.00000 ± 0.70000 fs^3
FOD = 0.00000 ± 0.00000 fs^4
QOD = 0.00000 ± 0.00000 fs^5
这很好。但是,我希望避免打印多余的0行,但我只希望在末尾修剪零,因此GDD=0行应该保持不变。由于这个原因,我无法添加类似于
if disp item!=0:打印(..)
到装饰器主体。理想的行为是:

GD = 1.00000 ± 0.10000 fs^1
GDD = 0.00000 ± 0.00000 fs^2
TOD = 7.00000 ± 0.70000 fs^3

我如何解决这个问题?

你可以这样做

from functools import wraps

def print_disp(f):
    @wraps(f)
    def wrapping(*args, **kwargs):
        disp, disp_std = f(*args, **kwargs)
        labels = ('GD', 'GDD','TOD', 'FOD', 'QOD')
        for i, (label, disp_item, disp_std_item) in enumerate(zip(labels, disp, disp_std)):
            if sum(disp[i:])+sum(disp_std[i:]) == 0:
              break
            print(f'{label} = {disp_item:.5f} ± {disp_std_item:.5f} fs^{i+1}')
            last_item = disp_item+disp_std_item
        return disp, disp_std
    return wrapping

如果只想打印带零的第一行,可以像这样修改装饰器,以跟踪是否打印这样的行:

def print_disp(f):
    @wraps(f)
    def wrapping(*args, **kwargs):
        zero_printed = False
        disp, disp_std = f(*args, **kwargs)
        labels = ('GD', 'GDD','TOD', 'FOD', 'QOD')
        for i, (label, disp_item, disp_std_item) in enumerate(zip(labels, disp, disp_std)):
            if disp_item == 0 and zero_printed:
                continue
            zero_printed |= disp_item == 0
            print(f'{label} = {disp_item:.5f} ± {disp_std_item:.5f} fs^{i+1}')
        return disp, disp_std
    return wrapping

谢谢,但不幸的是,它返回的结果与以前一样(至少对我来说是这样)。对不起,我误解了这个问题。我相应地删除了我的答案