Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2017 18:07:29

RADIOFARO
Зарегистрирован: 2017-03-09
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Две функции и одно условие (не могу понять)

Да, в Питоне почти ни бум-бум.
Экспериментирую со скриптами для Блендера
Встретил такое:

 map((function1, function2)[getattr(self, "enable_z")], elements_list)
Что есть map примерно понятно.
В нем первый аргумент должна быть функция.
Вот и не понимаю этот аргумент.
Точнее:
 (function1, function2)[getattr(self, "enable_z")]
Что здесь происходит?
function1 и function2 функции
getattr получит значение булевого параметра
Это будет запускать одну из функций в зависимости от полученного булевого значения?

Гугление описывает стандартное применение функций и не помогает.

Отредактировано RADIOFARO (Март 9, 2017 18:09:30)

Офлайн

#2 Март 9, 2017 18:20:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Две функции и одно условие (не могу понять)

RADIOFARO
getattr получит значение булевого параметра
Это старый-старый трюк
булевый тип в питоне можно использовать как индекс кортежа или списка, False дает нулевой элемент, True первый. Такую конструкцию лучше не использовать, а применять стандартный аналог тернарного оператора

 function2 if getattr(self, "enable_z") else function1



Офлайн

#3 Март 9, 2017 18:59:41

RADIOFARO
Зарегистрирован: 2017-03-09
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Две функции и одно условие (не могу понять)

Спасибо, FishHook.
Было у меня так написано.

        if self.enable_z:
            list( map(function2, elements_list))
        else:
            list( map(function1, elements_list))
Только функции поменял местами (function1 <—> function2)
и стало работать как нужно.

Когда работало с артефактами, подумал, что не правильно понял эту конструкцию.

Отредактировано RADIOFARO (Март 9, 2017 19:08:59)

Офлайн

#4 Март 10, 2017 01:54:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Две функции и одно условие (не могу понять)

RADIOFARO
В нем первый аргумент должна быть функция.
Вот и не понимаю этот аргумент.
Автор решил сократить код, в результате нарушил читаемость. Он плохо написал, поэтому ты не понимаешь. Это и есть говнокод - когда работает всё правильно, но в коде надо разбираться часами.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version