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

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

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

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

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

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