Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/47: Рейтинг темы: голосов - 47, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 24

Прерывание рекурсии

08.06.2016, 10:03. Показов 9084. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Знатоки, ну помогите. Код ниже делает обход вложенных словарей и при нахождении необходимого ключа должен свернуть все открытые рекурсии и вернуть значение self.Type = FeatureClass. Но сворачивает только нижний поток и упорно возвращается выше, естественно заменяя значение self.Type на пустое значение в своём пространстве имён. Как после выполнения условия if sField in listGeometryFields остановить все порождённые рекурсии и выйти из функции?
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
27
28
29
30
31
32
33
34
35
36
class DefineDataFromDictionary:
    def __init__(self, dictLayer):
        self.dictLayer  = dictLayer
           
    def DefineTypeLayer(self, sLayer, bStopRecursion = False):
        try:
            self.sLayer       = sLayer
            self.bStopRecursion = bStopRecursion
            self.Type         = ''
            
            if len(self.dictLayer[self.sLayer]) == 0:
                self.Type = 'empty data'
                self.bStopRecursion = True
            
            if not self.bStopRecursion:
                for sField in self.dictLayer[self.sLayer]:                
                    if sField in listGeometryFields:
                        print 'finded!!!!'
                        self.Type           = sFeatureClassType
                        self.bStopRecursion = True
                        return self.Type
                        
                    if type(self.dictLayer[self.sLayer]) == dict:
                        print 'new recursion!!!!'
                        self.objSubDict = DefineDataFromDictionary(self.dictLayer[self.sLayer])
                        self.objSubDict.DefineTypeLayer(sField, self.bStopRecursion)
                        del self.objSubDict
                
            if self.Type == '':
                self.Type = sTableType
                
            return self.Type
        except:
            tb = sys.exc_info()[2]
            print 'ERROR\tFail to execute script'
            print 'Line ' + str(tb.tb_lineno)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.06.2016, 10:03
Ответы с готовыми решениями:

Прерывание цикла while
Как сделать прерывание цикла (аргумент while), если прога не выводит какое-либо сообщения в командной строке? Просто прога создана для...

Прерывание программы по таймеру
Как мне создать собственное исключение для прерывания функции, если она выполняется дольше 1 секунды?

Прерывание запроса на сервер
Здравствуйте! Сайт написан на Python 2.6 Реализована передача данных на сервер в два этапа с последующими ответами сервера так же в два...

5
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
08.06.2016, 10:26
Видимо, потому что у вас в объекте порождается ещё один, который self.objSubDict. Отсюда путаница. Не надо так делать, пусть функция вызывается в этом же объекте.
0
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 24
08.06.2016, 11:02  [ТС]
В экземпляре класса у нас уже есть словарь. Т.е. его не использовать, а передавать его ещё раз в функцию? Как то тоже некрасиво... Буду делать без объекта self.objSubDict, думала есть способ их всех сразу прибить.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
08.06.2016, 15:32
Цитата Сообщение от NetPixie Посмотреть сообщение
В экземпляре класса у нас уже есть словарь. Т.е. его не использовать, а передавать его ещё раз в функцию?
Передавать не его, а содержащийся в нём дочерний словарь. По-моему, это очевидно следует из сути рекурсии.

Зачем вам лишний объект, он вообще не при делах тут. Он начнёт свою рекурсию, там не разберётесь вообще никогда.

Добавлено через 11 минут
Держите.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
d = {10: 2, 4: 8, 9: 7, 11:{14: 13, 33: 21, 3: {56: 19}}, 13: {16: 26}}
 
def rec_find(dic, pred):
    for k, v in dic.items():
        if type(v) is dict:
            found, res = rec_find(v, pred)
            if found:
                return True, res
        else:
            found = pred(k)
            if found:
                return True, (k, v)
    return False, None
 
print (rec_find(d, lambda k: k==33))
Добавлено через 6 минут
Пардон, косячок. Вот так надо:
Python
1
2
3
4
5
6
7
8
9
10
11
def rec_find(dic, pred):
    for k, v in dic.items():
        found = pred(k)
        if found:
            return True, (k, v)
 
        if type(v) is dict:
            found, res = rec_find(v, pred)
            if found:
                return True, res
    return False, None
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
08.06.2016, 15:42
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
27
28
29
30
31
class DefineDataFromDictionary:
    def __init__(self, dictLayer):
        self.dictLayer  = dictLayer
           
    def DefineTypeLayer(self, sLayer):
        try:
            self.sLayer       = sLayer
            self.Type         = ''
            
            if len(self.dictLayer[self.sLayer]) == 0:
                self.Type = 'empty data'
                return self.Type
            
            for sField in self.dictLayer[self.sLayer]:                
                if sField in listGeometryFields:
                    print 'found!!!'
                    self.Type           = sFeatureClassType
                    return self.Type
                        
                if type(self.dictLayer[self.sLayer]) == dict:
                    print 'new recursion!!!!'
                    self.Type = self.DefineTypeLayer(sField)
                
            if self.Type == '':
                self.Type = sTableType
                
            return self.Type
        except:
            tb = sys.exc_info()[2]
            print 'ERROR\tFail to execute script'
            print 'Line ' + str(tb.tb_lineno)
как то так может быть
0
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 24
09.06.2016, 12:00  [ТС]
oldnewyear, так не пойдёт, у меня
sLayer = 'node',
dictLayer[self.sLayer] - {'node': {'coordinate': {'lat': ["<type 'float'>", u'20.1119003296'], 'zlevel': ["<type 'int'>", u'0'], 'lon': ["<type 'float'>", u'-102.564788818'], 'z_coord': ["<type 'int'>", u'0']}, 'node_id': ["<type 'long'>", u'1121999621'], 'is_aligned': ["<type 'bool'>", u'False']}}
Будет крутиться на одном месте передавая в sField 'node' и выходя на рекурсию.

Добавлено через 32 минуты
dondublon, это работает, сохраню себе на будующее, спасибо.
Я вчера всё-таки сделала с созданием нового объекта класса в классе. Но не так как хотелось раньше. Мне всё равно нужен был полный список полей, я его вычитала, а потом просто по нему прошлась, определяя есть ли нужное мне. А просто список, без прерывания номально вычитывает:
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
class DefineDataFromDictionary:
    def __init__(self, dictLayer):
        self.dictLayer  = dictLayer
    def DefineListFields(self, sLayerWithFields, sFullFieldName = '', listFields = []):
        try:
            self.sLayerWithFields   = sLayerWithFields
            self.listFields         = listFields
            
            for sField in self.dictLayer[self.sLayerWithFields]:
                if type(self.dictLayer[self.sLayerWithFields]) == dict:
                    self.objSubDict = DefineDataFromDictionary(self.dictLayer[self.sLayerWithFields])
                    self.objSubDict.DefineListFields(sField, sFullFieldName + '.' + sField, self.listFields)                    
                    del self.objSubDict
                else:                    
                    if sFullFieldName != '':
                        sFullFieldName = sFullFieldName[1:]
                        self.listFields.append([sFullFieldName, sTypeField])
                    sFullFieldName = ''
                   
        except:
            tb = sys.exc_info()[2]
            print 'Line ' + str(tb.tb_lineno)
            print str(sys.exc_info()[:2])
        return self.listFields
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2016, 12:00
Помогаю со студенческими работами здесь

Прерывание выполнения программы
Как сделать так, чтобы выполнение программы прерывалось при определённой введённой команде? Даже если в этот момент выполняется что-то...

Ввод списка с клавиатуры и прерывание при 0
Здравствуйте. По заданию нужно ввести список с клавиатуры, при этом если вводиться 0, должно произойти прерывание, но пользоваться if...

Python Прерывание цикла зажатой клавишей
import os import time import win32api, win32con from numpy import * #Дальше идёт цикл: ... Где-то внутри цикла мне нужны...

Вычисление числа а в степени b с использованием рекурсии и без использования рекурсии
Реализуйте приложение, которое будет производить вычисление по формулам двумя способами: с использованием рекурсии и без использования ...

Вывести на экран результат возведения в степень числа с помощью рекурсии, подсчитать уровень рекурсии.
Задание: Вывести на экран результат возведения в степень числа с помощью рекурсии, подсчитать уровень рекурсии. Я и так знаю что даже ход...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru