Вы должны прочитать еще немного о декораторах, возможно, проверьте 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)
Обратите внимание, что это возвращает исходный класс от декоратора, если переменная окружения установлена (счастливый код-путь) и в противном случае завершает выполнение (следовательно, нет необходимости возвращать что-либо из декоратора).