将命令行参数传递给调用带有修饰符参数的修饰函数的函数

此示例是人为设计的,但代表了现实生活中的情况:

  1. 我有一个使用命令行参数的python脚本。

  2. main()将解析参数,并将其传递给中间函数(在代码示例中为caller_func

  3. 然后,中间函数将调用一个修饰函数(在示例中为fib()),该函数用lru_cache中的functools和{缓存是要从命令行接受并通过中间函数传递的参数。

我该怎么做?

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 设置为全局变量,但是它没有用,而且我还是不希望使用全局变量。

j5210 回答:将命令行参数传递给调用带有修饰符参数的修饰函数的函数

没有使用带有装饰器语法的装饰器。您可以等待“装饰” 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()
本文链接:https://www.f2er.com/3025966.html

大家都在问