python,如何使用@in class方法

Python, How to use the @ in class method

我尝试在类方法中使用@。这样地

1
2
3
4
class Dataset:
  @parse_func
  def get_next_batch(self):
      return self.generator.__next__()

解析函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
def parse_func(load_batch):
  def wrapper(**para):
    batch_files_path, batch_masks_path, batch_label = load_batch(**para)
    batch_images = []
    batch_masks = []
    for (file_path, mask_path) in zip(batch_files_path, batch_masks_path):
        image = cv2.imread(file_path)
        mask = cv2.imread(mask_path)
        batch_images.append(image)
        batch_masks.append(mask)
    return np.asarray(batch_images, np.float32), np.asarray(batch_masks, np.uint8), batch_label

  return wrapper

但是,当我给dataset.get_next_batch()打电话时,它会把exception调高,如下所示。

Traceback (most recent call last):
TypeError: wrapper() takes exactly 0 arguments (1 given)

你知道为什么会出现这个错误和任何解决方案吗?非常感谢你!


函数wrapper(**kwargs)只接受命名参数。但是,在实例方法中,self自动作为第一个位置参数传递。因为您的方法不接受位置参数,所以它失败。

您可以编辑到wrapper(self, **kwargs)或更一般的wrapper(*args, **kwargs)。但是,您使用它的方式,不清楚这些参数是什么。


只是简单的改变

1
2
3
4
5
6
7
8
9
10
11
12
13
def parse_func(load_batch):
  def wrapper(*para):
    batch_files_path, batch_masks_path, batch_label = load_batch(*para)
    batch_images = []
    batch_masks = []
    for (file_path, mask_path) in zip(batch_files_path, batch_masks_path):
        image = cv2.imread(file_path)
        mask = cv2.imread(mask_path)
        batch_images.append(image)
        batch_masks.append(mask)
    return np.asarray(batch_images, np.float32), np.asarray(batch_masks, np.uint8), batch_label

  return wrapper()

@符号表示一个修饰函数。这里的意思是parse_func(get_next_batch)。因此,如果使用关键字params(**para的包装器,您只想将一些参数传递给包装器,但实际上除了self参数之外,您不想传递这些参数。所以这里我将参数替换为位置参数*para