Python Wrapper/Decorator

Python Wrapper/Decorator

我想弄清楚 wrappers/decorators。

为此,我想创建一个简单的包装器,用于创建函数中不存在的目录:

import os

def _create_folder(func):
    def wrapper(directory):
        if not os.path.exists(os.path.dirname(directory)):
            os.makedirs(os.path.dirname(directory))
        func(directory)
    return wrapper

@_create_folder
def print_dir(directory):
    print(directory)

path = "C:/Temp"
print_dir(path)

我没有错误,但是没有创建文件夹。我错过了什么?

此外,最后,将被包装的函数在 class:

import os

def _create_folder(func):
    def wrapper(directory):
        if not os.path.exists(os.path.dirname(directory)):
            os.makedirs(os.path.dirname(directory))
        func(directory)
    return wrapper

class Test():
    @_create_folder
    def print_dir(self, directory):
        print(directory)

path = "C:/Temp"
test = Test().print_dir(path)

在那种情况下,我有以下错误:

TypeError: wrapper() takes 1 positional argument but 2 were given

如何让它在 class 中工作?

在第一个代码中,您应该在路径的最后添加'/'。

path="C:/Temp/"

os.path.dirname()函数可以使用'/'或'\'识别某个单词是否是文件夹。

因此,在您的代码中,os.path.dirname() 函数仅 returns "C:".

对于class,我只需要在装饰器中处理“self”:

def create_folder(func):
    def wrapper(self, directory):
        if not os.path.exists(os.path.dirname(directory)):
            os.makedirs(os.path.dirname(directory))
        func(self, directory)
    return wrapper

class Test():
    @create_folder
    def print_dir(self, directory):
        print(directory)

path = "C:/Temp/"
test = Test().print_dir(path)