Найти - Пользователи
Полная версия: Globals & Locals
Начало » Python для экспертов » Globals & Locals
1
Chrizt
Привет.

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

Я думал, может какой-нибудь global locals() сделать или типа того, но башку взорвал, пока это пытался набыдлокодить :(
Virtuos86
В 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__, и следовательно не будет и поиска атрибутов по нему. Только слоты нужно сразу указать.
Chrizt
Virtuos86
В 3-ем Python, кажется, для этого есть костыль
nonlocal var1, var2, …
Ну я пользую 2.6-2.7 =)

Virtuos86
За счёт использования слотов у инстанса temp не будет __dict__, и следовательно не будет и поиска атрибутов по нему. Только слоты нужно сразу указать.
О, вот это клёвая штука! Огромное спасибо за совет!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB