将命令行参数传递给使用装饰器参数调用装饰函数的函数
Passing command line arguments to a function that calls a decorated function with decorator arguments
这个例子是人为设计的,但代表了现实生活中的情况:
我有一个接受命令行参数的 python 脚本。
main()
将解析参数,并将它们传递给中间函数(代码示例中的 caller_func
)
中间函数会从functools
调用一个装饰函数(示例中的fib()
),lru_cache
装饰的[=18] =] 是从命令行接受并通过中间函数传递的参数。
我该怎么做?
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()
运行 为
python3 example.py --cache_size 5 --fibo_num 30
抛出
NameError: name 'cache_size' is not defined
我试着让 cache_size
成为一个全局变量,但是没有用,而且我也不想要全局变量。
您没有使用装饰器语法的装饰器。您可以等到 "decorate" fib
直到您拥有所需的缓存大小。例如,
import argparse
from functools import lru_cache
def main():
<b>global fib</b>
# 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)
<b>fib = lru_cache(maxsize=cache_size)(fib)</b>
<b>caller_func(fibo_num)</b>
#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()
这个例子是人为设计的,但代表了现实生活中的情况:
我有一个接受命令行参数的 python 脚本。
main()
将解析参数,并将它们传递给中间函数(代码示例中的caller_func
)中间函数会从
functools
调用一个装饰函数(示例中的fib()
),lru_cache
装饰的[=18] =] 是从命令行接受并通过中间函数传递的参数。
我该怎么做?
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()
运行 为
python3 example.py --cache_size 5 --fibo_num 30
抛出
NameError: name 'cache_size' is not defined
我试着让 cache_size
成为一个全局变量,但是没有用,而且我也不想要全局变量。
您没有使用装饰器语法的装饰器。您可以等到 "decorate" fib
直到您拥有所需的缓存大小。例如,
import argparse
from functools import lru_cache
def main():
<b>global fib</b>
# 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)
<b>fib = lru_cache(maxsize=cache_size)(fib)</b>
<b>caller_func(fibo_num)</b>
#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()