Вопрос по python - Общение Python мододелов

Вопрос Вопрос по python

Регистрация
28 Сен 2013
Сообщения
94
Репутация
0
Спасибо
0
Монет
0
def decorator(func1):

def func(*args, **kwargs):

print(func1(*args, **kwargs))

return func





def print(my_list):

for i in my_list:

return i.upper()







print = decorator(print)

print('hi', 'there')



почему не выполняется?

 
Регистрация
15 Ноя 2013
Сообщения
84
Репутация
8
Спасибо
0
Монет
0
Как ты на живой змее собрался код печатать?
 
Регистрация
22 Ноя 2013
Сообщения
97
Репутация
0
Спасибо
0
Монет
0
def decorator(func1):
def func(*args, **kwargs):
result = func1(*args, **kwargs)
if result is not None:
print(result)
return func

def my_print(my_list):
return [i.upper() for i in my_list]

my_print = decorator(my_print)
my_print(['hi', 'there'])
 
Регистрация
5 Ноя 2013
Сообщения
80
Репутация
0
Спасибо
0
Монет
0
а самом деле код выполняется, но есть несколько проблем:

Вы определяете функцию print, но это имя уже зарезервировано в Python для встроенной функции print(). Это может вызвать путаницу и привести к неправильным результатам. Лучше выбрать другое имя для вашей функции, например my_print.

В вашем декораторе вы используете функцию print в качестве функции-аргумента func1. Однако, в функции print вы используете оператор return, который прерывает выполнение цикла for и возвращает только первый элемент в верхнем регистре. Вместо этого, вы должны использовать оператор yield, чтобы вернуть все элементы списка в верхнем регистре.
 
Регистрация
18 Сен 2013
Сообщения
65
Репутация
12
Спасибо
1
Монет
0
Сам не знаю но я написал в ChatGPT 4 вот ответ: В вашем примере кода есть несколько проблем:

1. Переопределение встроенной функции `print`:
Вы переопределили встроенную функцию `print`, что может вызвать путаницу и ошибки в вашем коде. Это происходит потому что вы используете `print` как декоратор и как имя для своей собственной функции. Вам следует использовать другое имя для вашей функции вывода, чтобы избежать конфликтов.

2. `return` внутри цикла:
Использование `return` в цикле `for` приведет к немедленному выходу из функции при первой итерации, в результате чего будет обработан только первый элемент списка, а не все. Если ваше намерение - преобразовать каждый элемент списка и распечатать его, то вы должны использовать `print` (или альтернативную функцию вывода), чтобы печатать каждый элемент отдельно в цикле, а не возвращать его.

3. Неправильное использование декоратора:
В текущей реализации декоратор `decorator` принимает функцию, выполняет её с переданными аргументами и печатает результат. Так как вы переопределили `print`, ничего не будет выведено на экран, исходя из того, что уже есть имя `print` для вашей функции.

Исправленный код может выглядеть следующим образом:

```python
def decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print(result)
return wrapper

# Изменено имя функции, чтобы избежать конфликта с встроенной функцией print
def uppercase_items(my_list):
# Используется генератор для создания списка прописных букв
return [item.upper() for item in my_list]

# Используем декоратор, не переопределяя встроенную функцию print
decorated_uppercase_items = decorator(uppercase_items)

# Теперь функция будет печатать измененные элементы
decorated_uppercase_items(['hi', 'there'])
```

В данном примере, `decorated_uppercase_items` является версией вашей функции `uppercase_items`, модифицированной с помощью декоратора. Теперь она не только возвращает список преобразованных строк, но и выводит его на печать.
 
Сверху Снизу