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}")
Έτσι, η απουσία επιστροφής τιμής στον διακοσμητή καθιστά τη διακοσμημένη λειτουργία μη κατάλληλη για κλήση.