Python 将命令行参数传递给调用带有装饰参数的装饰函数的函数
这个例子是虚构的,但代表了一个真实的生活情况:Python 将命令行参数传递给调用带有装饰参数的装饰函数的函数,python,python-3.x,decorator,argparse,python-decorators,Python,Python 3.x,Decorator,Argparse,Python Decorators,这个例子是虚构的,但代表了一个真实的生活情况: 我有一个python脚本,它接受命令行参数 main()将解析参数,并将它们传递给中间函数(caller\u func在代码示例中) 然后,中间函数将从functools调用一个装饰函数(fib(),该函数用lru\u缓存装饰,缓存的maxsize是一个参数,将从命令行接受并通过中间函数传递 我该怎么做 import argparse from functools import lru_cache def main(): # boiler
main()
将解析参数,并将它们传递给中间函数(caller\u func
在代码示例中)functools
调用一个装饰函数(fib()
,该函数用lru\u缓存
装饰,缓存的maxsize
是一个参数,将从命令行接受并通过中间函数传递import argparse
from functools import lru_cache
def main():
# boilerplate for parsing command line arguments
parser = argparse.ArgumentParser()
parser.add_argument("--cache_size", default="10")
parser.add_argument("--fibo_num", default="20")
args = parser.parse_args()
cache_size = int(args.cache_size)
fibo_num = int(args.fibo_num)
caller_func(cache_size, fibo_num)
#Intermediate function that is supposed to call decorated function
def caller_func(cache_size, fib_num):
print(fib(fib_num))
#function decorated by LRU cache
@lru_cache(maxsize=cache_size)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
if __name__ == "__main__":
main()
投掷
NameError: name 'cache_size' is not defined
我尝试将cache\u size
设置为全局变量,但没有成功,而且我也不想要全局变量 您不必使用具有decorator语法的decorator。您可以等待“装饰”fib
,直到达到所需的缓存大小。比如说,
import argparse
from functools import lru_cache
def main():
global fib
# boilerplate for parsing command line arguments
parser = argparse.ArgumentParser()
parser.add_argument("--cache_size", default="10")
parser.add_argument("--fibo_num", default="20")
args = parser.parse_args()
cache_size = int(args.cache_size)
fibo_num = int(args.fibo_num)
fib = lru_cache(maxsize=cache_size)(fib)
caller_func(fibo_num)
#Intermediate function that is supposed to call decorated function
def caller_func(fib_num):
print(fib(fib_num))
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
if __name__ == "__main__":
main()
import argparse
从functools导入lru\U缓存
def main():
全局fib
#用于解析命令行参数的样板文件
parser=argparse.ArgumentParser()
parser.add_参数(“--cache_size”,default=“10”)
parser.add_参数(“--fibo_num”,default=“20”)
args=parser.parse_args()
cache\u size=int(args.cache\u size)
fibo_num=int(args.fibo_num)
fib=lru缓存(最大大小=缓存大小)(fib)
调用方函数(fibo_num)
#应该调用修饰函数的中间函数
def调用方函数(fib_num):
打印(fib(fib_num))
def纤维(n):
如果n<2:
返回n
返回fib(n-1)+fib(n-2)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
decorator在定义时执行,甚至在调用main之前执行。也许可以使用partial func,如下所示:Nice diagnosis@jornsharpe。那么解决办法是什么呢?有可能从命令行参数修饰这个修饰符吗?你不必像那样应用修饰符;考虑到中间层仍然需要缓存大小(到目前为止做什么?),您可以调用lru\u缓存(maxsize=cache\u size)(fib)(fibo\u num)
lru\u缓存(maxsize=cache\u size)(fib)(fibo\u num)
不会执行您想要的操作,因为它不会将函数fib
重新分配给装饰版本;因此,递归调用将在不使用缓存的未修饰的fib
函数上进行。
import argparse
from functools import lru_cache
def main():
global fib
# boilerplate for parsing command line arguments
parser = argparse.ArgumentParser()
parser.add_argument("--cache_size", default="10")
parser.add_argument("--fibo_num", default="20")
args = parser.parse_args()
cache_size = int(args.cache_size)
fibo_num = int(args.fibo_num)
fib = lru_cache(maxsize=cache_size)(fib)
caller_func(fibo_num)
#Intermediate function that is supposed to call decorated function
def caller_func(fib_num):
print(fib(fib_num))
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
if __name__ == "__main__":
main()