【发布时间】:2017-06-05 19:21:40
【问题描述】:
我已经编写了这个装饰器,它将中间结果保存在一个 json 文件中
import json
import os
def json_file(fname):
def decorator(function):
def wrapper(*args, **kwargs):
if os.path.isfile(fname):
with open(fname, 'r') as f:
ret = json.load(f)
else:
with open(fname,'w') as f:
ret = function(*args, **kwargs)
json.dump(ret, f)
return ret
return wrapper
return decorator
而用法是
@json_file("cached.json")
def some_calculation(n):
return {"result": 2**n}
我想增加使用这样的函数参数:
@json_file("cached_{n}.json")
def calculation(n):
return {"result": 2**n}
这样在调用函数时{n}被n的值替换。
我尝试将fname 替换为fname.format(**kwargs),但没有成功。
如何做到这一点?
编辑:
根据@jonrshape 的评论,这是我在添加.format(**kwargs) 后遇到的错误
<ipython-input-4-12b0c894b345> in wrapper(*args, **kwargs)
5 def decorator(function):
6 def wrapper(*args, **kwargs):
----> 7 fname = fname.format(**kwargs)
8 if os.path.isfile(fname):
9 with open(fname, 'r') as f:
UnboundLocalError: local variable 'fname' referenced before assignment
【问题讨论】:
-
n可以作为位置参数传递,你为什么期望在kwargs中?如果它必须始终是第一个参数,请更改为def wrapper(n, *args, **kwargs):。 -
用
calculation(n=5)调用函数也不起作用 -
请给minimal reproducible example 提供回溯,然后。一个简单的例子对我来说就很好。
-
为什么要投反对票?
-
关于
UnboundLocalError: local variable 'fname' referenced before assignment还有很多其他问题,这不是一个独特的问题。如果您不尝试在wrapper中重用相同的名称作为json_file中的参数,那么您所拥有的将起作用。