Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串内部API的Pythonic方法 问题_Python_Json_Abstract Class_Constants_Readonly Attribute - Fatal编程技术网

字符串内部API的Pythonic方法 问题

字符串内部API的Pythonic方法 问题,python,json,abstract-class,constants,readonly-attribute,Python,Json,Abstract Class,Constants,Readonly Attribute,在python内部和外部API中是否有pythonic(即canonical、official、PEP8 approved等)方法来重用字符串文本 出身背景 例如,我正在处理一些不一致的JSON处理代码,数千行代码中有我们组装、解析的各种JSON结构,等等。在代码审查期间出现的一个反复出现的问题是使用相同内部参数名称的不同JSON结构,造成混乱,最终导致出现错误,例如: pathPacket['src'] = "/tmp" pathPacket['dst'] = "

在python内部和外部API中是否有pythonic(即canonical、official、PEP8 approved等)方法来重用字符串文本

出身背景 例如,我正在处理一些不一致的JSON处理代码,数千行代码中有我们组装、解析的各种JSON结构,等等。在代码审查期间出现的一个反复出现的问题是使用相同内部参数名称的不同JSON结构,造成混乱,最终导致出现错误,例如:

pathPacket['src'] = "/tmp"
pathPacket['dst'] = "/home/user/out"
urlPacket['src'] = "localhost"
urlPacket['dst'] = "contoso"
这两个示例数据包有几十个同名字段,但它们表示非常不同的数据类型。这个实现没有代码重用的理由。人们通常使用代码完成引擎来获取JSON结构的成员,这最终会导致难以调试的问题,因为输入错误的字符串文本会导致功能问题,并且不会在前面触发错误。当我们必须更改这些API时,需要花费大量时间来查找字符串文本,以找出哪些JSON结构使用哪些字段

问题-重复 是否有一种更好的方法可以在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生成不能初始化为对象的抽象基类,并用只读常量填充它。 在整个项目中,将该类用作通用模块。 通过使用这些常量,我可以减少猴子修补错误的机会,因为如果拼写错误,符号将不存在,而字符串文字输入错误可能会在代码检查中漏掉。 我提出的解决方案可以接受建议/批评
通常的做法是:

JSON_PATH_SRC = "src"
JSON_PATH_DST = "dst"
JSON_URL_SRC = "src"
JSON_URL_DST = "dst"


pathPacket[JSON_PATH_SRC] = "/tmp"
pathPacket[JSON_PATH_DST] = "/home/user/out"
urlPacket[JSON_URL_SRC] = "localhost"
urlPacket[JSON_URL_SRC] = "contoso"
大写字母表示常量是它的方式。您将在标准库中看到这一点,甚至建议在:

常量通常是在模块级别定义的,并以所有形式写入 用下划线分隔单词的大写字母。例子包括 最大溢出和总计


Python没有真正的常量,而且似乎没有这些常量也能生存下来。如果在使用ABCmeta和属性的类中封装它会让您感觉更舒服,那么继续吧。事实上,我非常确定abc.ABCmeta不会阻止对象初始化。事实上,如果是这样的话,你对财产的使用就行不通了!属性对象属于该类,但要从实例访问。对我来说,这看起来像是一堆废话,收获很少。

通常的做法是:

JSON_PATH_SRC = "src"
JSON_PATH_DST = "dst"
JSON_URL_SRC = "src"
JSON_URL_DST = "dst"


pathPacket[JSON_PATH_SRC] = "/tmp"
pathPacket[JSON_PATH_DST] = "/home/user/out"
urlPacket[JSON_URL_SRC] = "localhost"
urlPacket[JSON_URL_SRC] = "contoso"
大写字母表示常量是它的方式。您将在标准库中看到这一点,甚至建议在:

常量通常是在模块级别定义的,并以所有形式写入 用下划线分隔单词的大写字母。例子包括 最大溢出和总计


Python没有真正的常量,而且似乎没有这些常量也能生存下来。如果在使用ABCmeta和属性的类中封装它会让您感觉更舒服,那么继续吧。事实上,我非常确定abc.ABCmeta不会阻止对象初始化。事实上,如果是这样的话,你对财产的使用就行不通了!属性对象属于该类,但要从实例访问。对我来说,这看起来像是一大堆繁琐的工作,收获甚微。

在我看来,创建常量最简单的方法就是将它们设置为模块中的变量,而不是修改它们

JSON_PATH_SRC = "src"
JSON_PATH_DST = "dst"
JSON_URL_SRC = "src"
JSON_URL_DST = "dst"
然后,如果您需要从另一个模块引用它们,它们已经为您指定了名称空间

>>> that_module.JSON_PATH_SRC
'src'
>>> that_module.JSON_PATH_DST
'dst'
>>> that_module.JSON_URL_SRC
'src'
>>> that_module.JSON_URL_DST
'dst'

在我看来,创建常量最简单的方法就是将它们设置为模块中的变量,而不是修改它们

JSON_PATH_SRC = "src"
JSON_PATH_DST = "dst"
JSON_URL_SRC = "src"
JSON_URL_DST = "dst"
然后,如果您需要从另一个模块引用它们,它们已经为您指定了名称空间

>>> that_module.JSON_PATH_SRC
'src'
>>> that_module.JSON_PATH_DST
'dst'
>>> that_module.JSON_URL_SRC
'src'
>>> that_module.JSON_URL_DST
'dst'

创建一组常量的最简单方法是将它们放入模块中,并根据需要导入它们。例如,您可以有一个带有

JSON_PATH_SRC = "src"
JSON_PATH_DST = "dst"
JSON_URL_SRC = "src"
JSON_URL_DST = "dst"
然后,您的代码将执行以下操作

from constants import JSON_URL_SRC
...
urlPacket[JSON_URL_SRC] = "localhost"
若您希望更好地定义常量分组,可以将它们粘贴到专用包中的单独模块中,例如允许您像constants.json.url.DST一样访问它们,也可以使用s。Enum类允许您将相关的常量集分组到单个命名空间中。您可以这样编写模块constants.py:

from enum import Enum

class JSONPath(Enum):
    SRC = 'src'
    DST = 'dst'

class JSONUrl(Enum):
    SRC = 'src'
    DST = 'dst'
from constants import JSONURL
...
urlPacket[JSONURL.SRC.value] = "localhost"

如何准确地分离常数取决于您。您可以有一个巨大的枚举,每个类别一个,或者介于两者之间。您可以通过以下方式访问代码中的:

from enum import Enum

class JSONPath(Enum):
    SRC = 'src'
    DST = 'dst'

class JSONUrl(Enum):
    SRC = 'src'
    DST = 'dst'
from constants import JSONURL
...
urlPacket[JSONURL.SRC.value] = "localhost"


创建一组常量的最简单方法是将它们放入模块中,并根据需要导入它们。例如,您可以有一个带有

JSON_PATH_SRC = "src"
JSON_PATH_DST = "dst"
JSON_URL_SRC = "src"
JSON_URL_DST = "dst"
然后,您的代码将执行以下操作

from constants import JSON_URL_SRC
...
urlPacket[JSON_URL_SRC] = "localhost"
若您希望更好地定义常量分组,可以将它们粘贴到专用包中的单独模块中 例如,允许您访问它们,如constants.json.url.DST,或者您可以使用s。Enum类允许您将相关的常量集分组到单个命名空间中。您可以这样编写模块constants.py:

from enum import Enum

class JSONPath(Enum):
    SRC = 'src'
    DST = 'dst'

class JSONUrl(Enum):
    SRC = 'src'
    DST = 'dst'
from constants import JSONURL
...
urlPacket[JSONURL.SRC.value] = "localhost"

如何准确地分离常数取决于您。您可以有一个巨大的枚举,每个类别一个,或者介于两者之间。您可以通过以下方式访问代码中的:

from enum import Enum

class JSONPath(Enum):
    SRC = 'src'
    DST = 'dst'

class JSONUrl(Enum):
    SRC = 'src'
    DST = 'dst'
from constants import JSONURL
...
urlPacket[JSONURL.SRC.value] = "localhost"


@AlexanderHuszagh问题是如何最好地用常量替换文字。@AlexanderHuszagh。这是关于枚举的,不是真正的实习strings@MadPhysicist啊,谢谢,对不起,我误读了这个问题。@MadPhysician Enum将适用于提出的示例,但可能不适用于所有使用这些字符串的地方。C++示例使用const而不是枚举类型来增强这一点。“Alxand”的问题是如何用常量替换文字。@ AlexanderHuszagh。这是关于枚举的,不是真正的实习strings@MadPhysicist啊,谢谢,对不起,我误读了这个问题。@MadPhysician Enum将适用于提出的示例,但可能不适用于所有使用这些字符串的地方。C++示例使用const而不是枚举类型来扩展这一点。可以将常数插入到单独的模块中并使用它。@ MaultRealSuthSur.Suffor甚至可以有一个可交换的模块来选择类似于本地化经常进行的常量组。您可以将常数插入到单独的模块中并使用它。@ Mal物理学家当然可以。您甚至可以使用一个可交换的模块来选择常量组,类似于本地化的常用方式。。