【问题标题】:Python: Best way to translate constants?Python:翻译常量的最佳方式?
【发布时间】:2023-03-07 00:30:01
【问题描述】:

背景: 我正在向需要返回常量名称列表的现有类添加一个新函数。

假设我在一个类中有许多常量

JOHN = 1
SMITH = 4
BEN = 8
...

我有一个返回列表常量值的 Web 服务函数,而不是返回 [1,4,8] 我想返回更有意义的数据,例如 ['JOHN', 'SMITH', 'BEN']

什么是有效的方法?

【问题讨论】:

  • 不太清楚你在问什么。这个常量列表在哪里?在网络服务器上?它是如何返回这些常量、服务器端或通过 HTTP 请求的?
  • 试试flufl.enum
  • dict 可能是最简单的方法。

标签: python constants


【解决方案1】:

您可以将map() 与映射字典一起使用。

arg_map = {1 : 'JOHN', 4 : 'SMITH', 8 : 'BEN'}
translated_result = map(arg_map.get, result_list)

正如 cmets 中所提到的,列表推导也可以在这里工作。请注意,您可以通过用括号替换方括号来使其成为生成器。

arg_map = {1 : 'JOHN', 4 : 'SMITH', 8 : 'BEN'}
translated_result = [arg_map.get(val, '%s NOT MAPPED' % str(val)) for val in result_list]

【讨论】:

  • 使用列表推导而不是 map 会生成更惯用的 Python 代码,否则这是最好的方法。
  • 我期待一些我不知道的魔术函数/代码,看起来我需要使用字典,因为所有常量都已经定义,我可能不得不做 {'JOHN':约翰,“本”:本}
  • 重构到字典中可能会更好,这样事情只定义一次。但是,如果您不能这样做,当然,您所说的内容会正常工作(尽管键必须是要映射的值,而不是要映射到的值)。
  • 列表理解“稍微”过于复杂;)[arg_map[x] for x in args] 将是最简单的解决方案,如果提供了无效的 int,则会引发异常(比在结果中添加“未映射”字符串更好imo,但取决于问题)
  • @JamesLin:您可能不必构建单独的对象并明确列出它们。如果可以从它们的名称中识别出这些值,那么 d = {k: getattr(obj, k) for k in dir(obj) if not k.startswith("__")} 之类的东西会将这些值提取到一个字典中而不指定它们。 [你也可以反过来。]
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2012-03-31
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多