在 Python 中使用字典(dict)键时,似乎有几种通用的方法:
some_dict['key_name'] # 到处都是字符串常量
some_dict[KeyConstants.key_name] # where class KeyConstants: key_name: 'key_name'
some_dict[KEY_NAME] # with from some_module import KEY_NAME # 模块级常量
'key_name' 的缺点是您在整个代码中重复常量。这不是干的。更糟糕的是,如果你曾经去发布你的 API(在最广泛的意义上),你将让你的 API 的消费者到处重复这些常量,如果你想将 'key_name' 更改为 'better_key_name' 这将是一个破坏性的变化.
这是类型化语言,DRY 方法,常量集中在一个地方。它唯一的缺点是它很丑陋、可读性差一点并且比较冗长。 Pythonic 原则主要禁止这样做。它使您可以轻松更改表示 key 的常量,因为每个人的编码都是针对变量 KeyConstants.key_name。它还适用于 IDE 进行重构。
模块级常量在 PEP 8 风格指南中被推荐。 ALL_CAPS_ARE_LOUD 并且更难打字。这具有选项 1 和 2 的一些优点。
字典键常量还有哪些其他最佳实践?首选上述哪种方法,何时使用?
最佳答案
- d['键名']
- d[Keys.key_name]
- d[KEY_NAME]
我真的不认为#3 需要模块级导入;它们只能在模块命名空间中,例如你可以做类似 How to programmatically set a global (module) variable? 的事情
与#1 相比,#2 的优势在于拼写错误和过时的值会引发属性错误“此键不存在!”而不是索引错误“找不到!” -- 这总是更好。 #2>#1。它也不是更冗长,因为如果你输入很多,你只需设置 K=Keys
(或其他东西),所以你有 d[K.key_name]
,只是多两个字()。例如,根据我之前的感觉,我可以做以下任一事情:
import subprocess as proc
proc.Popen(..., stdout=proc.PIPE)
或
import subprocess as proc
PIPE = proc.PIPE
proc.Popen(..., stdout=PIPE)
或
from subprocess import *
Popen(..., stdout=PIPE)
关于#3,ALL_CAPS_ARE_LOUD 是有原因的;区分 d[someVariable]
(可以包含任何关键字)和 d[magicKeyword]
变得很困惑——而 d[MAGIC_KEYWORD]
明确表示它是一个常量,而不是某个可能保持常量的变量,例如对于 magicKeywords 中的一些变量
。 #3 基本上等同于 #2,例如re.DOTALL
(re
等同于 KeyConstants
,无需记住 KeyConstants
容器的名称,因为它是模块)。因此,#3 优于#2,除非您处于具有不同类型的键空间的奇怪情况。
DRY/OAOO 非常非常重要,但最终与这些都无关,因为你总是需要重复一个变量名才能引用它;您能做的最好的事情就是创建一个别名。
您还可以考虑#4,即为您的字典赋予属性,例如d.key_name
-- 这仅适用于某些可订阅对象。
但引用 Jochen Ritzel 的评论:“使用常量键应该是一个非常罕见的场合”(使用对象的属性,或者他建议的命名元组,尽管我已经总是发现它们笨重)
关于python - 字典 dict 键常量的 Python 最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6088581/