为了漂亮地打印我的计算结果,我编写了一个装饰器:
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)):
print(f'{label} = {disp_item:.5f} ± {disp_std_item:.5f} fs^{i+1}')
return disp, disp_std
return wrapping
它可以通过以下方式使用:
import numpy as np
@print_disp
def calc():
disp = np.array([1, 0, 7, 0, 0])
disp_std = np.array([0.1, 0, 0.7, 0, 0])
return disp, disp_std
然后它会返回
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: print(..)
这样的东西。所需的行为是:
GD = 1.00000 ± 0.10000 fs^1
GDD = 0.00000 ± 0.00000 fs^2
TOD = 7.00000 ± 0.70000 fs^3
我该如何解决这个问题呢?
发布于 2020-05-15 08:49:37
如果只想打印第一行,可以像这样修改装饰器,以跟踪是否打印这样的行:
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
发布于 2020-05-15 08:43:29
你可以这样做
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
https://stackoverflow.com/questions/61815010
复制