vel*_*hin 16 python coding-style
在Python中使用字典(dict)键时,似乎有一些通用的方法:
some_dict['key_name'] # string constants everywhere
some_dict[KeyConstants.key_name] # where class KeyConstants: key_name: 'key_name'
some_dict[KEY_NAME] # with from some_module import KEY_NAME # a module level constant
'key_name'的缺点是你在整个代码中重复常量.这不是干的.更糟糕的是,如果您要发布您的API(从最广泛的意义上说),您将让API的消费者在任何地方重复这些常量,如果您想要将'key_name'更改为'better_key_name',那将是一个重大变化.
这是键入的语言DRY方法,常量合并在一个地方.它唯一的缺点是它丑陋,可读性稍差,而且更冗长.Pythonic原则主要禁止这样做.它允许您轻松更改表示键的常量,因为每个人都在对变量KeyConstants.key_name进行编码.它也适用于IDE进行重构.
PEP 8样式指南中建议使用模块级常量.ALL_CAPS_ARE_LOUD并且难以输入.这具有选项1和2的一些优点.
dict键常量有哪些其他最佳实践?以上哪种方法是首选的,何时?
我并不真正认为 #3 需要模块级导入;它们只是可以在模块命名空间中,例如,您可以执行诸如如何以编程方式设置全局(模块)变量之类的操作?
#2 相对于 #1 的优点是拼写错误和过时的值会抛出属性错误“这个键不存在!” 而不是索引错误“找不到!” ——这总是更好。#2>#1。它也不是更冗长,因为K=Keys如果你打字很多,你只是设置(或其他东西),所以你d[K.key_name]只有两个字符()。例如,根据我的感觉,我可能会这样做:
import subprocess as proc
proc.Popen(..., stdout=proc.PIPE)
Run Code Online (Sandbox Code Playgroud)
或者
import subprocess as proc
PIPE = proc.PIPE
proc.Popen(..., stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)
或者
from subprocess import *
Popen(..., stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)
关于#3,ALL_CAPS_ARE_LOUD 是有原因的;区分d[someVariable](可以包含任何关键字)和d[magicKeyword]-会变得混乱,而d[MAGIC_KEYWORD]明确的是它是一个常量,而不是某些可能包含常量的变量,例如for someVariable in magicKeywords. #3 基本上等同于 #2,例如re.DOTALL(re等同于KeyConstants,不必记住KeyConstants容器的名称,因为它是模块)。因此,#3 优于#2,除非您处于具有不同类型键空间的奇怪情况。
DRY / OAOO 非常非常重要,但最终与其中任何一个都无关,因为您总是需要重复变量名才能引用它;您能做的最好的事情就是创建一个别名。
您还可以考虑#4,即为您的字典赋予属性,例如d.key_name——这仅适用于某些可下标对象。
但是引用 Jochen Ritzel 的评论:“使用常量键应该是非常罕见的情况”(使用对象的属性,或者像他建议的那样使用命名元组,尽管我一直发现它们很笨拙)
| 归档时间: |
|
| 查看次数: |
7379 次 |
| 最近记录: |