问题
python
是否有“pythonic”(即规范、官方、PEP8 批准等)方式在内部(和外部)API中重用字符串文字?
背景
例如,我正在使用一些(不一致的)JSON 处理代码(数千行),其中有各种struct
我们组装、解析等的 JSON “s”。代码审查期间出现的反复出现的问题之一是不同的 JSON struct
s 使用相同的内部参数名称,导致混淆并最终导致出现错误,例如:
pathPacket['src'] = "/tmp"
pathPacket['dst'] = "/home/user/out"
urlPacket['src'] = "localhost"
urlPacket['dst'] = "contoso"
这两个(示例)数据包具有数十个相同名称的字段,但它们代表非常不同类型的数据。这个实现没有代码重用的理由。人们通常使用代码完成引擎来获取 JSON 的成员struct
,这最终会导致难以调试的问题,因为错误输入的字符串文字会导致功能问题,并且不会更早地触发错误。当我们必须更改这些 API 时,需要花费大量时间来寻找字符串文字以找出哪些 JSONstruct
使用哪些字段。
问题 - Redux
有没有更好的方法可以在社区成员中普遍使用python
?如果我在 中执行此C++
操作,则前面的示例将类似于:
const char *JSON_PATH_SRC = "src";
const char *JSON_PATH_DST = "dst";
const char *JSON_URL_SRC = "src";
const char *JSON_URL_DST = "dst";
// Define/allocate JSON structs
pathPacket[JSON_PATH_SRC] = "/tmp";
pathPacket[JSON_PATH_DST] = "/home/user/out";
urlPacket[JSON_URL_SRC] = "localhost";
urlPacket[JSON_URL_SRC] = "contoso";
我最初的方法是:
- 用于创建无法初始化为对象
abc
的抽象基类,并用只读常量填充它。 - 在整个项目中将该类用作公共模块。
- 通过使用这些常量,我可以减少猴子修补错误的机会,因为如果拼写错误,符号将不存在,而字符串文字拼写错误可能会通过代码审查。
我提出的解决方案(接受建议/批评)
from abc import ABCMeta
class Custom_Structure:
__metaclass__ = ABCMeta
@property
def JSON_PATH_SRC():
return self._JSON_PATH_SRC
@property
def JSON_PATH_DST():
return self._JSON_PATH_DST
@property
def JSON_URL_SRC():
return self._JSON_URL_SRC
@property
def JSON_URL_DST():
return self._JSON_URL_DST