Найти - Пользователи
Полная версия: Использование аттрибута функции __dict__ для хранения переменной.
Начало » Python для новичков » Использование аттрибута функции __dict__ для хранения переменной.
1
dimy44
Вот два простых участка кода для демонстрации сути вопроса. Имеется две функции: start, она запускает цикл while, в теле которого что-то делается, и stop, которая прекращает этот цикл.
#
Здесь за жизнедеятельность цикла отвечает глобальная переменная flag:
def start():
    global flag
    flag = 1
    while flag:
        print 'cycle works'
def stop():
    global flag
    flag = 0
#
а здесь заюзан аттрибут функции start __dict__, и переменную не нужно объявлять глобальной:
def start():
    start.flag = 1 # аналогично start.__dict__['flag'] = 1
    while start.flag:
        print 'cycle works'
def stop():
    start.flag = 0
#
имеет ли такой подход право на существование, и чем он плох(хорош)?
doza_and
Тут у вас недосказанность. Как вы будете выполнять stop если у вас выполняется start?

Это вопрос про многопоточное выполнение. Там этих механизмов в избытке.

start.flag тоже глобальная как и global flag. поэтому принципиальной разницы в обоих подходах нет. Второй немного сложнее но позволяет группировать флаги.

Оба подхода нежелательны.
4kpt
doza_and
Да. У меня тоже был первый вопрос: где это можно применить? Может есть такой вариант, где без такой возможности не обойтись. Ну а применение глобальных переменных не есть хорошо никогда. С этим я согласен полностью. Хотя подход необычен…
adray
doza_and
Все же инкапсулированный атрибут - меньшее зло, по сравнению с глобальной переменной

4kpt
Возможно не самая хорошая идея, но время уже позднее:
def run_foo(foo):
   .....
   threading.Thread(target=foo).start()
   .....
run_foo.lck = threading.Lock()
with run_foo.lck:
   run_foo(foo)
В таком варианте обертки объекту блокировки самое место в атрибутах функции
dimy44
doza_and
Тут у вас недосказанность. Как вы будете выполнять stop если у вас выполняется start?Это вопрос про многопоточное выполнение. …
Да, я привел схематичные примеры, и не предугадал такой вопрос. Мой мозг “испорчен” PyS60 (Python for Symbian), там для многократного выполнения этих функций многопоточность не нужна.
Спасибо за ответы.
4kpt
adray
Как-то очень замысловато…
Неужели нет аналога, чтобы заменить сей код?
Приведите, пожалуйста, действующий пример…
adray
4kpt
Это я на ночь глядя ерунду написал

Думаю, всегда можно будет найти замену атрибутам функции. Какую - вопрос вкуса и здравого смысла.
Если нужен объект, который ведет себя как функция и иногда как класс с атрибутами, то подход с __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