Написание функции декоратора в Python - PullRequest
0 голосов
/ 13 февраля 2020

Извиняюсь, если это повторяется, но я изо всех сил пытаюсь найти решение с этим. Я пытаюсь написать функцию декоратора ниже.

  def search_func(sheetname):
    def insider(function):
        def wraper(*args, **kwargs):
            file = openpyxl.load_workbook("C:\\Users\khisr\OneDrive\Documents\TestPage.xlsx")
            currnet_sheet = file[sheetname]
            function(currnet_sheet)
        return wraper
    return insider         


@search_func('Passwords')
def Longin(self, currnet_sheet):
    Name = self.User_name.get() + str(self.Password.get())
    for i in range(1,current_sheet.max_row +1):
       for j in range(1,current_sheet.max_column+1):
           if current_sheet.cell(i,j).value == Name:

Функция вызывается кнопкой;

self.Button = tk.Button(self.Main_frame, text='Enter', bg = 'green', command = self.Longin)

Я получаю сообщение об ошибке

"Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/khisr/OneDrive/Documents/PythonProjects/Dubai_Project/login.py", line 71, in wraper
    function(currnet_sheet)
TypeError: Longin() missing 1 required positional argument: 'currnet_sheet"

Любая помощь или похвала высоко ценится.

Приветствия

1 Ответ

1 голос
/ 13 февраля 2020

Методы привязаны к self, если посмотреть на него. При декорировании метода результирующий декорированный метод ищется на self, а не на базовом методе. Вам необходимо явно передать параметр self.

def search_func(sheetname):
  def insider(function):
      def wraper(self):  # the decorated method receives self...
          file = openpyxl.load_workbook("C:\\Users\khisr\OneDrive\Documents\TestPage.xlsx")
          currnet_sheet = file[sheetname]
          function(self, currnet_sheet)  # ...and should pass it on
      return wraper
  return insider

Обратите внимание, что если вы хотите поддерживать не просто обычные методы, вы должны (частично) повторить протокол дескриптора .

def search_func(sheetname):
  def insider(function):
      def wrapper(self):  # the decorated method receives self...
          file = openpyxl.load_workbook("C:\\Users\khisr\OneDrive\Documents\TestPage.xlsx")
          currnet_sheet = file[sheetname]
          function.__get__(self, type(self))(currnet_sheet)  # ...and should pass it on
      return wraper
  return insider  
...