- d['key_name']:使用字符串作为键名。
- d[Keys.key_name]:使用变量作为键名,可以避免拼写错误和过时值的问题,如果键名不存在会抛出属性错误而不是索引错误。
- d[KEY_NAME]:与第一种方式类似,但是使用大写字母。
个人认为第三种方式不需要进行模块级别的导入,只需要将其置于模块命名空间中即可。例如,您可以参考如何以编程方式设置全局(模块)变量?
相对于第一种方式,第二种方式的优点在于可以避免拼写错误和过时值的问题,如果键名不存在会抛出属性错误而不是索引错误,这总是更好的选择。因此,我认为第二种方式优于第一种。而且,它并不比第一种方式更冗长,因为你只需要设置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)
关于第三点,全大写是有原因的;如果不这样做,则很难区分
d[someVariable]
(可以包含任何关键字)和
d[magicKeyword]
——而
d[MAGIC_KEYWORD]
则明确表示它是一个常量,而不是可能包含常量的变量,例如
for someVariable in magicKeywords
。第三点基本上等同于第二点,例如
re.DOTALL
(
re
相当于
KeyConstants
,无需记住
KeyConstants
容器的名称,因为它就是该模块)。因此,除非您处于具有不同类型的键空间的奇怪情况,否则第三点优于第二点。
DRY / OAOO非常重要,但最终与这些内容无关,因为您总是需要重复变量名才能引用它;您所能做的最好的事情就是创建别名。
您还可以考虑第四点,即赋予字典属性,例如d.key_name
——这只适用于某些可订阅对象。
但是引用Jochen Ritzel的评论:“使用常量键应该是非常罕见的”(使用对象的属性,或者如他建议的命名元组,尽管我始终觉得它们难以使用)。