Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 2, 2011 15:28:50

Chrizt
От: Владивосток
Зарегистрирован: 2009-07-18
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Globals & Locals

Привет.

Вот подскажите, плиз, как бы так исхитриться:
В объявлении класса есть метод. Для оптимизации в методе объявляется функция, которая должна кое-что изменить, возвратить и всё такое.
Однако, эта функция изменяет довольно много разных данных вне функции, а вызывается она в цикле. Плюс, после цикла есть дополнительная обработка значений, которые функция меняет. Слишком много значений, которые функция возвращает, довольно трудно передать и вернуть, а так же объявлять глобальными.
И вот вопрос: может, есть какой-то способ все эти локальные для метода переменные изменить в функции и при этом чтобы они изменились для метода?

Я думал, может какой-нибудь global locals() сделать или типа того, но башку взорвал, пока это пытался набыдлокодить :(



Офлайн

#2 Окт. 3, 2011 09:33:58

Virtuos86
От:
Зарегистрирован: 2010-11-17
Сообщения: 33
Репутация: +  1  -
Профиль   Отправить e-mail  

Globals & Locals

В 3-ем Python, кажется, для этого есть костыль
nonlocal var1, var2, …
А так выход только в использовании изменяемых объектов, то есть вместо переменных использовать список или словарь, типа
variables = {'x': 1, ‘y’: 5}
variables, variables
Можно и класс использовать.
Хотя в цикле искать атрибуты в __dict__ класса будет накладно.
Впрочем есть такой вариант:

class foo(object):
def methode(self):
temp = type('storage', (object,), {'__slots__': ('x', 'y')})()
def bar():
temp.x = 2
temp.y = 5
bar()
print temp.x, temp.y

foo().methode()
За счёт использования слотов у инстанса temp не будет __dict__, и следовательно не будет и поиска атрибутов по нему. Только слоты нужно сразу указать.



Офлайн

#3 Окт. 3, 2011 13:15:50

Chrizt
От: Владивосток
Зарегистрирован: 2009-07-18
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Globals & Locals

Virtuos86
В 3-ем Python, кажется, для этого есть костыль
nonlocal var1, var2, …
Ну я пользую 2.6-2.7 =)

Virtuos86
За счёт использования слотов у инстанса temp не будет __dict__, и следовательно не будет и поиска атрибутов по нему. Только слоты нужно сразу указать.
О, вот это клёвая штука! Огромное спасибо за совет!!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version