Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Теперь "отдельно взятые товарищи" довольны моими декораторами? Или "опять"? Одно тут только тут не понятно...

Celtic Hammer Мудрец (15882), закрыт 1 год назад
Если написать add_to = func(args) - возвращается вот такая штука.
(('hello', 'world', 'my', 'name is', 'Artem'),)
Кортеж в кортеже... Что за фигня, откуда это?
Задача:
"Напишите декоратор add_args, который добавляет к переданным аргументам еще два значения: строку begin в начало аргументов, строку end в конец. Также декоратор должен сохранить первоначальное имя декорируемой функцию и ее строку документации"
Лучший ответ
Равшан Бузоев Искусственный Интеллект (863711) 1 год назад
Товарищи! Среди нас есть такие товарищи, которые нам вовсе не товарищи
Остальные ответы
Professional Professional Мудрец (15855) 1 год назад
Эта проблема может возникнуть, если вы вызываете функцию и передаёте аргументы в виде кортежа, не распаковав его.

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

```python
from functools import wraps

def add_args(func):
@wraps(func)
def wrapper(*args, **kwargs):
new_args = ('begin',) + args + ('end',)
return func(*new_args, **kwargs)
return wrapper
```

В этом коде `@wraps(func)` используется для сохранения имени и документации оригинальной функции. Затем аргументы (`*args`), переданные в функцию, преобразуются в кортеж и к нему добавляются строки 'begin' и 'end'.

Но, как я сказал ранее, если вы передаете аргументы в виде кортежа, то получите кортеж в кортеже. Чтобы этого избежать, вам нужно распаковать аргументы при вызове функции. Например, `func(*args)` вместо `func(args)`.
Celtic HammerМудрец (15882) 1 год назад
Передай боту чтобы не порол чушь.
Алекс Куха Высший разум (455899) 1 год назад
так были же короче решения источник
Celtic HammerМудрец (15882) 1 год назад
Там вообще другое. А это я чисто для себя
Vitness Просветленный (35214) 1 год назад
Так не соответствует же условию... Сказано декоратор должен к переданным аргументам добавлять значения, а тут значения к результату функции добавляются
Celtic HammerМудрец (15882) 1 год назад
В условии требовалось чтобы выводилось
['begin', 'hello', 'world', 'my', 'name is', 'Artem', 'end']
Требовалось сделать именно такой вывод результата, а не что-то другое
Vitness Просветленный (35214) Celtic Hammer,
который добавляет к переданным аргументам еще два значения: строку begin в начало аргументов, строку end в конец.
Про требование сделать именно такой вывод ничего не было. Просто функция подстроена так, чтобы казалось, что изменяются аргументы. Но они никак не изменялись.
Celtic HammerМудрец (15882) 1 год назад
Декаратор кстати и делает именно то что добавляет к аргументам новые значения. Так что ты что-то попутал...
Vitness Просветленный (35214) Celtic Hammer, пример функции
 @add_args('begin', 'end')
def func(*args):
    assert len(args) == 3

func(1) 
Передается один аргумент, но с декоратором должно оказаться 3. И assert тогда сработает
Похожие вопросы