我公司的非循环代码执行 dict(enumerate(list)).get(number) 而不仅仅是 list[number] 有什么好的理由吗?

Any good reason my company's non-looping code does dict(enumerate(list)).get(number) instead of just list[number]?

我公司有一段遗留的 Python 代码,我正在考虑重构。

它不是仅仅访问 sys.argv[0]sys.argv[3] 等,而是首先执行 args_dict = dict(enumerate(sys.argv)) 然后访问系统参数 args_dict.get(0)args_dict.get(3)

我觉得这很傻。

我想知道这是否是某种重构遗留下来的错字,我现在也可以重构一个更复杂的东西。

我注意到一些使用这种模式的更复杂的代码库确实将 args_dict 作为名为 args_dict 的参数传递给方法……但似乎 sys.argv 也可以很容易作为 args_list 传递,甚至直接从这些方法中调用?

是否有任何可能的原因,例如使用越界参数位号时的安全性,实际上最好使用字典访问事物 .get(number) 而不是使用列表 [number]?或者我可以为了简单而安全地重构吗?

如果代码只是使用索引,就不会有安全差异:尝试访问列表中不存在的索引将抛出 IndexError;尝试访问字典中不存在的键将抛出 KeyError。无论哪种方式,您都必须捕获异常或以某种方式确保您在范围内。

但是代码没有使用 args_dict[i],而是使用 args_dict.get(i),这不会引发错误;如果密钥丢失,它只是 returns None。所以也许这就是重点?列表没有类似的方法。

我可以理解从 sys.argv 复制到另一个变量,特别是如果另一个变量可能通过与 command-line 参数不同的机制初始化。如果键是配置参数名称或其他内容,则转换为字典也有意义。但我同意 - 仅使用索引作为键似乎很奇怪,而且我不确定避免 IndexErrors 是否足以做一些让代码读者感到困惑的事情。

一般来说,如果您要处理 CLI 参数,最好将它们处理成更有意义的东西,而不是从它们到达 sys.argv 的方式进行一对一映射。 built-in argparse 非常强大;还有 add-on 模块(我喜欢 argh)可以做一些有用的事情,比如自动将 CLI 参数转换为方法参数。