python - 可以将对模块的引用分配给变量然后使用变量而不是模块吗?

标签 python python-2.7

假设我打开了一个文件并从中读取 JSON 数据:

import json
with open('filename', 'r') as infile:
    data = json.load(infile)

对于我使用的 pickle 文件:

import pickle
with open('filename', 'r') as infile:
    data = pickle.load(infile)

现在我希望能够将我的代码段用于两种格式,即:

import json
import pickle

def read_data(filename, preferred_serializer)
    with open(filename, 'r') as infile:
        data = preferred_serializer.load(infile)
    return data

并这样调用它:

data1 = read_data('file.pickle', pickle)
data2 = read_data('file.json', json)

似乎 可以工作,因为 jsonpickle 共享相同的 API load(infile)。但我想知道它是否只是偶然起作用,或者这是否是定义的行为和合理的方法。

最佳答案

这很好。模块只是对象,就像 Python 中的其他一切一样。

这不是偶然的,它是设计使然,Python 确实尽量在命名上保持一致,因此反序列化数据的函数通常称为 load。参见 marshal.load()再举个例子。或者 yaml.load() .

如果你想让它更通用,你可以存储 load 函数引用:

def read_data(filename, deserialize)
    with open(filename, 'r') as infile:
        data = deserialize(infile)
    return data

data1 = read_data('file.pickle', pickle.load)
data2 = read_data('file.json', json.load)

毕竟,函数也只是对象,现在您使函数独立于可调用对象的名称。

关于python - 可以将对模块的引用分配给变量然后使用变量而不是模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250037/

相关文章:

Python:如何将 2.7 模块导入 3.4 程序?

python - 如何正确 pickle 命名元组实例

python - 带 flask 的服务图像

python - 有没有办法在 pandas 列之间进行条件减法?

python - groupby 并根据另一列的值保留一列的信息

python - 如何在 WSGI env 中处理本地长期存在的对象

python-2.7 - 通过数据包注入(inject)进行 HTTP 响应欺骗

python - 当前方法和类名进入日志记录;这些方法在功能上是否等效?

python - 获取 DuplicateKeyError 的重复值

python bson.errors.InvalidDocument : Cannot encode object: datetime. 日期 (2015, 3, 1)