python - 字典 dict 键常量的 Python 最佳实践是什么?

标签 python coding-style

在 Python 中使用字典(dict)键时,似乎有几种通用的方法:

  1. some_dict['key_name'] # 到处都是字符串常量

  2. some_dict[KeyConstants.key_name] # where class KeyConstants: key_name: 'key_name'

  3. some_dict[KEY_NAME] # with from some_module import KEY_NAME # 模块级常量

    1. 'key_name' 的缺点是您在整个代码中重复常量。这不是干的。更糟糕的是,如果你曾经去发布你的 API(在最广泛的意义上),你将让你的 API 的消费者到处重复这些常量,如果你想将 'key_name' 更改为 'better_key_name' 这将是一个破坏性的变化.

    2. 这是类型化语言,DRY 方法,常量集中在一个地方。它唯一的缺点是它很丑陋、可读性差一点并且比较冗长。 Pythonic 原则主要禁止这样做。它使您可以轻松更改表示 key 的常量,因为每个人的编码都是针对变量 KeyConstants.key_name。它还适用于 IDE 进行重构。

    3. 模块级常量在 PEP 8 风格指南中被推荐。 ALL_CAPS_ARE_LOUD 并且更难打字。这具有选项 1 和 2 的一些优点。

字典键常量还有哪些其他最佳实践?首选上述哪种方法,何时使用?

最佳答案

  1. d['键名']
  2. d[Keys.key_name]
  3. 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/

相关文章:

python - 使用 len() 和 def __len__(self) : to build a class

c++ - Eclipse CDT Source->Implement Method 生成不遵循定义的代码样式的代码

python - 跨语言客户端/服务器的双向 RPC 选项

python - SQL 的 "NOT IN"运算符的 Pandas 模拟

python - 如何在 Python 中使用文本文件作为输入?

java - Java 中枚举最常见的用法是什么?

python - django - 如果没有服务器重置,表单字段将不会更新......再次实例化一个类

python - 让 BeautifulSoup 跳过我的 html 的一部分..或拆分它

coding-style - 是否有任何代码 DRYer 工具?

c# - 在 C# 中返回两个列表的最佳方法是什么?