Sobes.tech
Middle

Τι συμβαίνει αν ο διακοσμητής δεν επιστρέφει καμία τιμή;

sobes.tech AI

Απάντηση από AI

Αν ένας διακοσμητής (decorator) δεν επιστρέφει ρητά καμία τιμή (ή επιστρέφει το None), τότε η λειτουργία στην οποία εφαρμόζεται θα αντικατασταθεί με το None. Κατά την επόμενη κλήση αυτής της "διακοσμημένης" λειτουργίας, θα προκύψει σφάλμα TypeError, καθώς θα προσπαθήσουμε να καλέσουμε το None ως λειτουργία.

# Παράδειγμα 1: Διακοσμητής που δεν επιστρέφει τίποτα
def my_decorator_broken(func):
    print("Κλήση διακοσμητή")
    # Δεν υπάρχει εντολή return

@my_decorator_broken
def my_function():
    print("Κλήση λειτουργίας")

# Εδώ, το my_function γίνεται None

# Η προσπάθεια κλήσης του my_function θα προκαλέσει σφάλμα
# try:
#     my_function()
# except TypeError as e:
#     print(f"Σφάλμα: {e}") # Έξοδος: Σφάλμα: 'NoneType' object is not callable

Ένας σωστός διακοσμητής που διατηρεί τη λειτουργικότητα της αρχικής λειτουργίας πρέπει να επιστρέφει είτε την ίδια τη λειτουργία είτε μια νέα λειτουργία (συνήθως ένα wrapper) που καλεί την αρχική.

# Παράδειγμα 2: Σωστός διακοσμητής που επιστρέφει ένα wrapper
import functools

def my_decorator_correct(func):
    @functools.wraps(func) # Διατηρεί τα μεταδεδομένα της αρχικής λειτουργίας
    def wrapper(*args, **kwargs):
        print("Πριν την κλήση της λειτουργίας")
        result = func(*args, **kwargs) # Κλήση της αρχικής λειτουργίας
        print("Μετά την κλήση της λειτουργίας")
        return result # Είναι σημαντικό να επιστρέφουμε το αποτέλεσμα της κλήσης ή None αν χρειάζεται
    return wrapper # Ο διακοσμητής επιστρέφει το wrapper

@my_decorator_correct
def my_function_correct(x, y):
    return x + y

# Σωστά διακοσμημένη λειτουργία
result = my_function_correct(5, 3)
print(f"Αποτέλεσμα κλήσης: {result}")

Έτσι, η απουσία επιστροφής τιμής στον διακοσμητή καθιστά τη διακοσμημένη λειτουργία μη κατάλληλη για κλήση.