【发布时间】:2019-11-27 15:39:19
【问题描述】:
我有以下代码在最终调用 matplotlib 的脚本中从命令行设置 y 轴和 x 轴限制(这里,ax 是 matplotlib axes 对象,但这并不重要,并且p 是 ArgumentParser 实例):
p.add_argument('--ylim', help='Set the y axis limits explicitly (e.g., to cross at zero)', type=float, nargs='+')
p.add_argument('--xlim', help='Set the x axis limits explicitly', type=float, nargs='+')
# more stuff
if args.ylim:
if (len(args.ylim) == 1):
ax.set_ylim(args.ylim[0])
elif (len(args.ylim) == 2):
ax.set_ylim(args.ylim[0], args.ylim[1])
else:
sys.exit('provide one or two args to --ylim')
if args.xlim:
if (len(args.xlim) == 1):
ax.set_xlim(args.xlim[0])
elif (len(args.xlim) == 2):
ax.set_xlim(args.xlim[0], args.xlim[1])
else:
sys.exit('provide one or two args to --xlim')
如果你相信DRY 可能会让你的眼睛发烫:这两个块是相同的,只是xlim 在第二个处替换了ylim。
如何重构它以删除重复项?我调用两次的某种限制设置功能似乎很明显,但是我如何传递我想在一种情况下调用 set_ylim 而在另一种情况下调用 set_xlim 的事实?
请注意,在不指定 --*lim 参数中的一个或两个的情况下调用脚本是完全有效的,并且应该表现得好像从未调用过相应的 set_*lim 函数(即,如上面的代码中一样 - 尽管如果函数被调用,但效果与示例相同,也很好)。
【问题讨论】:
标签: python python-3.x refactoring argparse dry