Использование декораторов в классах python3 - PullRequest
0 голосов
/ 05 мая 2019

Пожалуйста, помогите понять, как правильно использовать декораторы в классах.Например, я хочу проверить переменные перед выполнением класса, и, если он существует, запустить класс с этой переменной.Как это сделать?

Мой пример не работает:

import os,sys
import requests


def checkCredentials(function):
  KEY = os.environ['KEY']
  if KEY:
    print("exist")
    return KEY
  else:
    print("nope")
    sys.exit(0)


@checkCredentials
class StartUp(object):

  def __init__(self, argument1):
    self.argument1 = argument1

  def printstr(self):
    print(self.argument1)


if __name__ == '__main__':
  start = StartUp()

Моя ошибка:

python3.6 ./main.py 
exist
Traceback (most recent call last):
  File "./main.py", line 26, in <module>
    start = StartUp()
TypeError: 'str' object is not callable

1 Ответ

1 голос
/ 05 мая 2019

Вы должны прочитать еще немного о декораторах, возможно, проверьте PEP 3129 или PEP 318 . Следующий пример из предыдущего PEP иллюстрирует семантику декораторов классов:

# Solution 1: Without class decorators
class A:
  pass
A = foo(bar(A))

# Solution 2: With class decorators
@foo
@bar
class A:
  pass

Два решения дают идентичные результаты. В Solution 1 функции foo и bar явно вызываются для изменения исходного класса A и создания измененного варианта. Используя декораторы, тот же эффект может быть достигнут гораздо более четко: это Solution 2.

Давайте применим это к вашему примеру кода. Ваша последняя строка кода

start = StartUp()

, что переводится как

start = checkCredentials(StartUp)()

Однако checkCredentials либо ничего не возвращает, либо str, следовательно, TypeError. Я не уверен, что именно вы хотите достичь с декоратором. Если все, что вам нужно, это проверить наличие определенной переменной среды, следующий декоратор может дать желаемый эффект:

def checkCredentials(cls):
  KEY = os.environ['KEY']
  if KEY:
    print("exist")
    return cls
  else:
    print("nope")
    sys.exit(0)

Обратите внимание, что это возвращает исходный класс от декоратора, если переменная окружения установлена ​​(счастливый код-путь) и в противном случае завершает выполнение (следовательно, нет необходимости возвращать что-либо из декоратора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...