【问题标题】:Python Wrapper/DecoratorPython 包装器/装饰器
【发布时间】:2021-05-20 02:23:58
【问题描述】:

我正在尝试找出包装器/装饰器。

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

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)

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

此外,最后,将被包装的函数在一个类中:

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

如何让它在类中工作?

【问题讨论】:

    标签: python-3.x decorator wrapper


    【解决方案1】:

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

    path="C:/Temp/"
    

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

    因此,在您的代码中,os.path.dirname() 函数仅返回“C:”。

    【讨论】:

      【解决方案2】:

      对于类,我只需要处理装饰器中的“自我”:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 2013-08-07
        • 2014-01-23
        相关资源
        最近更新 更多