[英]Passing command line arguments to a function that calls a decorated function with decorator arguments
這個例子是人為的,但代表了現實生活中的情況:
我有一個接受命令行參數的 python 腳本。
main()
將解析參數,並將它們傳遞給中間函數(代碼示例中的caller_func
)
然后,中間函數將調用一個裝飾函數(示例中的fib()
,該lru_cache
由functools
lru_cache
裝飾,緩存的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()
運行方式
python3 example.py --cache_size 5 --fibo_num 30
投擲
NameError: name 'cache_size' is not defined
我嘗試將cache_size
全局變量,但沒有用,而且我也不想要全局變量。
您不必使用與裝飾語法裝飾。 您可以等待“裝飾” 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.