假设我打开了一个文件并从中读取 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)
毕竟,函数也只是对象,现在您使函数独立于可调用对象的名称。
关于python - 可以将对模块的引用分配给变量然后使用变量而不是模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250037/