Я пытаюсь использовать @ в методе класса. как это

class Dataset:
  @parse_func
  def get_next_batch(self):
      return self.generator.__next__()

И функция синтаксического анализа, как это:

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 (последний вызов был последним): TypeError: wrapper () принимает ровно 0 аргументов (1 дано)

Знаете ли вы, почему возникает эта ошибка и какое-либо решение? Большое спасибо!

0
nwpuxhld 25 Сен 2018 в 12:05

2 ответа

Лучший ответ

Функция wrapper(**kwargs) принимает только именованные аргументы . Однако в методах экземпляра self автоматически передается в качестве первого позиционного аргумента. Поскольку ваш метод не принимает позиционные аргументы, он терпит неудачу.

Вы можете отредактировать в wrapper(self, **kwargs) или, что более общее, wrapper(*args, **kwargs). Однако, как вы его используете, не ясно, что это за аргументы.

1
blue_note 25 Сен 2018 в 09:20

Просто поменяй

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.

0
tianhua liao 25 Сен 2018 в 09:14