簡體   English   中英

將命令行參數傳遞給調用帶有裝飾器參數的裝飾函數的函數

[英]Passing command line arguments to a function that calls a decorated function with decorator arguments

這個例子是人為的,但代表了現實生活中的情況:

  1. 我有一個接受命令行參數的 python 腳本。

  2. main()將解析參數,並將它們傳遞給中間函數(代碼示例中的caller_func

  3. 然后,中間函數將調用一個裝飾函數(示例中的fib() ,該lru_cachefunctools 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM