我公司的非循环代码执行 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 参数不同的机制初始化。如果键是配置参数名称或其他内容,则转换为字典也有意义。但我同意 - 仅使用索引作为键似乎很奇怪,而且我不确定避免 IndexError
s 是否足以做一些让代码读者感到困惑的事情。
一般来说,如果您要处理 CLI 参数,最好将它们处理成更有意义的东西,而不是从它们到达 sys.argv
的方式进行一对一映射。 built-in argparse
非常强大;还有 add-on 模块(我喜欢 argh
)可以做一些有用的事情,比如自动将 CLI 参数转换为方法参数。
我公司有一段遗留的 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 参数不同的机制初始化。如果键是配置参数名称或其他内容,则转换为字典也有意义。但我同意 - 仅使用索引作为键似乎很奇怪,而且我不确定避免 IndexError
s 是否足以做一些让代码读者感到困惑的事情。
一般来说,如果您要处理 CLI 参数,最好将它们处理成更有意义的东西,而不是从它们到达 sys.argv
的方式进行一对一映射。 built-in argparse
非常强大;还有 add-on 模块(我喜欢 argh
)可以做一些有用的事情,比如自动将 CLI 参数转换为方法参数。