Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4

DefautParameters decorator

15.10.2014, 08:03. Показов 1360. Ответов 3

Студворк — интернет-сервис помощи студентам
Задача: декорировать функции значениями по дефолту(связывание по именам словаря)СигнатураФункции:
Python
1
def defaultDecorate(func, **defaultParams): ...
Пример использования:
Python
1
2
3
4
defaultParams = {'x':1, 'y':2}
def sumXYZ(x, y, z): return x+y+z
decoreSumXYZ = defaultDecorate(sumXY, **defaultParams)
print(decoreSumXYZ(z=3)) #output: 6
Что написать вместо ... ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.10.2014, 08:03
Ответы с готовыми решениями:

Decorator
Просмотрите и протестируйте пример шаблона Decorator с помощью классов Subject, SubjectDecorator, Teacher. Например, у учителя есть...

Python decorator
то что сделал не совсем устроил формат. как прописать декоратор под тип ввода данных @dec def f3(): n = 101 x =...

Паттерн Decorator
Имеется небольшая php-страница, работающая с БД. Имеется класс для поиска в БД записи по введенной фамилии. <?php //namespace...

3
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
15.10.2014, 09:14
Видимо, как-то так:
Python
1
2
3
4
5
6
7
8
9
10
11
def sumXY(x, y):
    return x+y
 
def getSumZ(z):
    def plusZ(x):
        return sumXY(x, z)
    return plusZ
 
sumZ = getSumZ(3)
print sumZ(4)
# output: 7
Непонятно, почему это вы называете декорированием. Декорирование - приведение объектов к общему виду. Скорее, это надо назвать каррированием или частичным применением. Тут не совсем ясно, что надо, но копать туда.
1
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
15.10.2014, 15:32  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Непонятно, почему это вы называете декорированием. Декорирование - приведение объектов к общему виду. Скорее, это надо назвать каррированием или частичным применением. Тут не совсем ясно, что надо, но копать туда.
Я щас и сам смотрю, что скорее всего из моего примера можно сделать выводы о каррировании, но это декорирование.
Суть в том, чтобы обычную функцию произвольной сигнатуры привести к виду функции с параметрами по умолчанию
Python
1
F(x,y,z,....) => F(x=d[x], y=d[y], z=d[z],...)
Вы показали частный пример каррирования, вот частный пример декорации
Python
1
2
3
4
5
6
7
def sumXYZ(x,y,z): return x+y+z
 
def decorateXYZ(func, **defaults):
    return lambda x = defaults.get('x'), y = defaults.get('y'), z = defaults.get('z') : func(x,y,z)
 
decorateSumXYZ = decorateXYZ(sumXYZ, x=1, y=2, z=3)
print(decorateSumXYZ(z=7)) # output 10
Проблема в том что это частный случай..... Нужен общий метод декорации, который будет работать с произвольными сигнатурами функций
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
16.10.2014, 03:06
Лучший ответ Сообщение было отмечено sigmov как решение

Решение

Так попробуйте:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from functools import wraps
 
def default_params(*args, **kwargs):
    def decorator(func):
        @wraps(func)
        def wraper(*args_, **kwargs_):
            kwargs.update(kwargs_)
            return func(*(args_ + args[len(args_):]), **kwargs)
        return wraper
    return decorator
 
@default_params(1, 2, 3)
def sumXYZ(x, y, z):
    return x + y + z
 
@default_params(x=4, y=5, z=6)
def sumXYZ_(x=0, y=0, z=0):
    return x + y + z
 
print(sumXYZ())
print(sumXYZ(4))
print(sumXYZ_())
print(sumXYZ_(x=7))
print(sumXYZ_(y=7))
Добавлено через 11 минут
так корректнее:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from functools import wraps
 
def default_params(*args, **kwargs):
    def decorator(func):
        @wraps(func)
        def wraper(*args_, **kwargs_):
            tmp = {}
            tmp.update(kwargs)
            tmp.update(kwargs_)
            return func(*(args_ + args[len(args_):]), **tmp)
        return wraper
    return decorator
 
@default_params(1, 2, 3)
def sumXYZ(x, y, z):
    return x + y + z
 
@default_params(x=4, y=5, z=6)
def sumXYZ_(x=0, y=0, z=0):
    return x + y + z
 
print(sumXYZ())
print(sumXYZ(4))
print(sumXYZ_())
print(sumXYZ_(x=7))
print(sumXYZ_(y=7))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2014, 03:06
Помогаю со студенческими работами здесь

Паттерн Decorator
Всем привет. Нужен маскимально простенький код или несколько кодов для пояснения Декоратора( его работы и особенности ). На языке С++...

Разобраться с паттерном Decorator
Добрый день. У кого есть время и терпенье, помогите разобрать с декоратором… (На примере С#) Хочу добавить к классу DirectoryInfo метод...

Патерн Decorator для программы
мне нужно использовать паттерн Decorator в моей программе. У меня есть две функции в разных класах void...

Decoupling event dispatcher: to use the decorator or not?
Всем привет. Замечали когда-нибудь, что реализуя код вызова события, вылезают мысли что что-то не так в таком подходе? Дело в том, что...

Как правильно применять патерн Decorator
на примере системы управления точкой по продаже кофе с помощью паттерна Decorator class Coffee { cost () //метод возврата цены { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru