Skip to main content
 首页 » 编程设计

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

2025年05月04日28sky-heaven

假设我打开了一个文件并从中读取 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) 

这 似乎 可以工作,因为 json 和 pickle 共享相同的 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) 

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