Реально ли работать на питоне не понимая сути декораторов?
В общем пытаюсь учить питон и не могу никак понять суть декораторов.
Всё зависит от того, насколько давно вы уже пытаетесь их понять и всё никак.
Если покумекав пару минут уже отчаялись, то наверно программирование - не ваша стезя.
Если прочитав пару статей не смогли разобраться, то, может быть, следует сделать еще одну попытку. Или вы считаете, что это прям рокет сайнс и раз уж с первого подхода не осилили, то это уж на всю жизнь теперь "работать без декораторов". Судьба.

Вообще меня удивляет такой фатализм. Ну не понял ты что-то, так разбирайся, а не беги выяснять можно ли без этого прожить всю жизнь. Декораторы - это очень простая концепция.
Если ты не способен её понять, то программировать профессионально не сможешь - это факт. 

И нет, на декораторах свет клином не сошелся. Нужно понимать что в питоне функция - это объект первого рода и что это значит.
Нужно понимать, что такое "замыкание" в контексте функционального программирования.
Более того, нужно понимать что такое дескрипторы, как работают мета-классы и много-много всего такого.

Нет, с этими знаниями не рождаются, их нужно осваивать.

Декораторы - это очень простая концепция.
Декоратор - это функция, которая принимает в качестве единственного аргумента какую-то функцию. Декоратор что-то делает с этой функцией (где-то регистрирует ее, документирует, оборачивает её вызов в другую функию) и возвращает её изменённую или другую функцию-обёртку.

Что конкретно вам не понятно?

Надо заметить, что Декоратор как паттерн проектирования имеет боле еширокий смысл. Декорировать можно объекты, классы, функции, даже модули (постольку, поскольку это тоже объекты). Учиться вам надо, сударь, и не ожидать, что всё прошьётся в мозг мгновенно. Быть программистом - это всегда учиться. Не останавливаясь.

Примеров декораторов огромное множество: самые простые и понятные - это:
- замер времени выполнения  функции
- кэширование результата
- подстановка части аргументов (partial)
Не набиваюсь в знатоки Python, просто скажу как я понял их:
Допустим, у нас есть некоторая функция, которая отправляет файл по почте

def send_mail(text):
    pass

И вдруг, нам захотелось, что бы отправка логировалась как то по особому, причем функцию логирования мы хотим подключить и к другим нашим функциям, которых так много, что везде писать одно и то же не с руки (т.е. не только при отправке писем, но и при сохранении на диск непример). Для этого мы пишем функцию, куда декоратор @ автоматически подставит нашу функцию. Возвращать же наша функция тоже должна функцию. 

def my_loger(func):    # Объявляем декоратор
    def new_func(*args, **kwarts): # Объявляем функцию, которая заменит исходную
        print("Begin send")   # делаем что то важное
        func(*args, **kwargs)    # Вызываем исходную функцию
        print("End send")    # Опять делаем что то важное
    return new_func   # Возвращаем новую функцию

Теперь, при объявлении функций мы можем перед ней написать @my_loger, и логирование будет подключено автоматически.

т.е., написав следующее 

@my_loger
def send_mail(test):
    pass

фактически мы получим код

def send_mail(text)
    print("Begin send")
    # Some actions
    print("End send")