Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将命令行参数传递给调用带有装饰参数的装饰函数的函数_Python_Python 3.x_Decorator_Argparse_Python Decorators - Fatal编程技术网

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

这个例子是虚构的,但代表了一个真实的生活情况:

  • 我有一个python脚本,它接受命令行参数

  • 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()