首页 > 解决方案 > 如何优雅地在python中串行(或区分)函数参数或串行函数调用结果?

问题描述

我需要串行一些函数结果。

现在,我的解决方案是使用pickle包和一个名为@serial_result

def serial_result(func):
    def wrapper(*args, **kwargs):
        dump_fname = func.__name__ + ('.' + str(args) if args else '') + ('.' + str(kwargs) if kwargs else '') + '.dump'
        serial_file = SERIAL_FILE_DIR + dump_fname
        if os.path.exists(serial_file):
            print('[serial_result] is loading results of function %s ...' % (func.__name__,))
            return pickle.load(open(serial_file, 'rb'))
        else:
            result = func(*args, **kwargs)
            print('[serial_result] is dumping results of function %s ...' % (func.__name__,))
            pickle.dump(result, open(serial_file, 'wb'))
            return result

    return wrapper
@serial_result
def get(type):
    pass

装饰器首先检查转储文件是否存在。如果是这样,反序列化并返回。或者调用函数,序列化结果并写入文件。

装饰器的第一个版本只是func.__name__用作串行文件名,一个函数使用一个相同的转储文件。
但是我想让装饰器识别传递给函数的不同参数,get(0)并且 可能get(1)返回不同的结果。
现在我只使用str(args)str(kwargs)作为转储文件名。
我认为这种做法迟早会坏掉:特殊字符、对象内存地址等等。

问题来了:
装饰器必须区分传递的不同参数。还有其他想法可以更优雅和pythonic吗?

标签: python

解决方案


推荐阅读