如何避免在Python中对大量的dict键字符串进行硬编码

时间:2019-05-04 19:02:47

标签: python string dictionary hard-coding

可能是一个常见问题,但是我是python新手!

我正在研究一些处理json查询的库,并问自己是否有一些最佳实践来避免对大量json键进行硬编码,例如:

F

当我看到它时,它不喜欢我,我创建了一个具有如下常量的类:


# just an example..
var1 = response.json()["ACRI"]["message"]["title"]
var2 = response.json()["ACRI"]["message"]["content"]
var3 = response.json()["ACRI"]["message"]["meta"]["timestamp"]

这是一个好习惯吗?关于python编译器,我是否不了解?

谢谢

编辑:我正面临着性能和/或内存消耗的最佳实践

4 个答案:

答案 0 :(得分:1)

性能应该您最不用担心,可维护性更重要。为字符串使用符号名的一个很好的理由是,您不能轻易地键入它,例如c.f。

KEY_SYMBOLS = "Symbols"

foo[KEY_SYMOBLS]

vs

foo["Symobls"]

IDE或linter甚至可以在运行代码之前找到前一种错字并突出显示它,但不太可能是后者。


在性能方面,性能最高的Python代码是不会在字符串中存储字符串的代码。编译后,将同一模块中相同字符串的不同用法合并为仅引用一个字符串常量:

>>> 'foo' is 'foo'
True

尽管如此,Chepner的答案仍然是:您不必从根本上解决子词典。

答案 1 :(得分:1)

您的初始策略非常适合Zen of Python。它具有很高的可读性,使用Python的任何人都会立即理解它。但是,您的第二个示例过于复杂,难以理解。

也就是说,可以用parse json so that it becomes an object with attributes代替带键的字典。您的代码将如下所示:

    render() {
        return(
            <div style={{ width: 500 }}>
            <Document
                file={this.state.pdfData }
                onLoadSuccess={() => console.log("Success")}
                onLoadError = {(error) => console.log(error.message)}
            >
                <Page pageNumber={1} />
            </Document>
            </div>
        );

    }

或者,define a simple class会照顾它:

export const getData = id => async (dispatch) => {
    let response;
    try {
        response = API_CALL
        console.log(response)                // PDF raw data printed
        let rawLength = response.length;
        let array = new Uint8Array(new ArrayBuffer(rawLength));
        for (let i=0; i < rawLength; i++){
            array[i] = response.charCodeAt(i);
        }
        console.log(array);                 //array value printed
        return array;
    } catch (error) {
        dispatch(setError(error.message));
        throw error;
    }
};

答案 2 :(得分:0)

每个嵌套的dict是可以存储其引用的dict。

resp = response.json()["ACRI"]["message"]
var1 = resp["title"]
var2 = resp["content"]
var3 = resp["meta"]["timestamp"]

答案 3 :(得分:0)

如果从文件中读取 JSON 数据,请使用以下代码片段。

with open("config.json") as json_data_file:
    json_text = json_data_file.read()
    json_data = json.loads(json_text, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))

# Access data using below format 
var1 = json_data.key1.subkey1
var2 = json_data.key2.subkey2