Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Parameters_Decorator_Python Decorators - Fatal编程技术网

Python 如何在装饰器和装饰函数之间获得相同的/来传递参数?

Python 如何在装饰器和装饰函数之间获得相同的/来传递参数?,python,python-3.x,parameters,decorator,python-decorators,Python,Python 3.x,Parameters,Decorator,Python Decorators,在这种情况下,我想将\u source\u dir\u abs:str传递到decorator中 我试图模拟Flask路由的相同过程,将参数从装饰器传递到装饰的函数。但这使得参数被解释为文本字符串而不是变量 @dec_check_abs("<_source_dir_abs>") def walk_return_dir_nofolder(_source_dir_abs:str) -> list: w = walk(_source_dir_abs) d = [d f

在这种情况下,我想将
\u source\u dir\u abs:str
传递到decorator中

我试图模拟Flask路由的相同过程,将参数从装饰器传递到装饰的函数。但这使得参数被解释为文本字符串而不是变量

@dec_check_abs("<_source_dir_abs>")
def walk_return_dir_nofolder(_source_dir_abs:str) -> list:
    w = walk(_source_dir_abs)
    d = [d for d, fol, fil in w if len(fol) == 0]
    return d

你错过了装饰师的重点。您没有在decorator声明中传递参数;该装饰器返回的函数接受参数,并可以在必要时将其传递给包装函数

所以装饰师看起来像这样:

def dec_check_abs(func):
    def wrapper(*args):
        if ... do your check on args here...:
            return func(*args)
        else:
            print('No, bad caller.')
    return wrapper
您可以将其用作:

@dec_check_abs
def walk_return_dir_nofolder(_source_dir_abs:str) -> list:
    ...

我的问题在Reddit线程中得到了解答

这是我的代码

def dec_check_abs(*params):
    def decorator(func):
        sig = inspect.signature(func)
        def wrapper(*args, **kwargs):
            bound = sig.bind(*args, **kwargs)
            for param in params:
                val = bound.arguments[param]

                if not check_abs(val):
                    """Raise warning."""
                    napw()

                    if sig.return_annotation == bool:
                        return False
                    else:
                        return None

            return func(*args, **kwargs)
        return wrapper
    return decorator

@dec_check_abs("source_dir_abs")
def check_isfolder(source_dir_abs:str) -> bool:
    return os.path.isdir(source_dir_abs)

@dec_check_abs("source_dir_abs", "dest_dir_abs")
def copy_fileorfolder(source_dir_abs:str, dest_dir_abs:str) -> bool:
    shutil.copy2(source_dir_abs, dest_dir_abs)
    return True

什么是装饰师?我认为一切以“@”开头的东西都是装饰师,对吗?为什么这是被否决的:\?是的,我可以看出这是装饰师,但除此之外我对这件事一无所知。它的定义是什么?它的定义是什么?Decorator包装函数对象。发生这种情况时,函数根本并没有被调用,所以无论您试图传递给decorator构造函数的是什么,都还不存在。你可以在dectorator
\uuuu call\uuuuu
dunder中处理它,但就是这样。我很肯定Flask是用
@app.route(“/api/mic/”)
完成的。如果不是一个论点,那又是什么呢?那确实是一个论点。但这根本不是你所要求的;您的问题似乎是关于如何将参数从函数传递给装饰器。这是一个示例。您可以看到,对于decorator和修饰函数,您可以获得相同的
\u clientName
。我也想达到同样的效果,但这个例子并没有说明你所说的效果。这里发生的事情是装饰器包装器正在将参数传递给装饰函数。忘记我的声明吧。我想要一些像我的烧瓶的例子。我该怎么做?
def dec_check_abs(*params):
    def decorator(func):
        sig = inspect.signature(func)
        def wrapper(*args, **kwargs):
            bound = sig.bind(*args, **kwargs)
            for param in params:
                val = bound.arguments[param]

                if not check_abs(val):
                    """Raise warning."""
                    napw()

                    if sig.return_annotation == bool:
                        return False
                    else:
                        return None

            return func(*args, **kwargs)
        return wrapper
    return decorator

@dec_check_abs("source_dir_abs")
def check_isfolder(source_dir_abs:str) -> bool:
    return os.path.isdir(source_dir_abs)

@dec_check_abs("source_dir_abs", "dest_dir_abs")
def copy_fileorfolder(source_dir_abs:str, dest_dir_abs:str) -> bool:
    shutil.copy2(source_dir_abs, dest_dir_abs)
    return True