我有以下代码,可以在脚本中从命令行设置y和x轴的限制条件,最终调用matplotlib(这里,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
参数的情况下调用脚本是完全有效的,并且应该像上面的代码一样行为(也就是说,如果函数被调用,但具有与示例相同的效果,那也可以)。
--xlim
或--ylim
未设置的情况不起作用,但是当传递0个参数时,set_xlim
似乎是无操作的。 - BeeOnRope[None,None]
,这将不会对它们产生影响。 - Alexnargs='+'
,需要同时使用xlim
和ylim
。None列表可以解决这个问题。但是,你也可以使用nargs='*'
和稍微修改的检查方式。 - Alex--[x|y]lim
,实际上这是调用此脚本最常见的方式。离开它们应该是“好像”没有调用set_*
方法一样。我正在更新问题,包括argparse
行以使其更清晰。 - BeeOnRope