download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Питонка за Питан

Автор
Съобщение
angelicstar
Пон, 06.04.09, 17:06
Упс! Сбърках заглавието на темата.
Трябва да е "Питанка за Питон"
Ами номерът е такъв. Едно упражнение за Питон трябва да се направят 3 модула a, b и c. aтрябва да импортва b, b трябва да импортва c, c да импортва b. Задачката стана от раз, ама не мога да разбера защо. Като тръгне a да импортва b, тогава b трябва да дръпне c. Ама с ще тръгне да тегли b и тогава b ще дърпа от c и с пак ще дръпне b, а b ще дърпа от с и с от b и b от с ..... Ще зацикли.
Да ама не цикли. И не мога да загрея защо.

milen
Пон, 06.04.09, 22:06

RE: Питонка за Питан

Не познавам Питон, но според мен импортването на модул не е като извикването на процедура/функция. Вероятно някъде интерпретатора отбелязва кои модули са импортнати до момента и не ги импортира пак.
Възможно е обаче и да не съм разбрал правилно въпроса
insecteater
Пон, 06.04.09, 22:45
milen явно е прав.
Ето какво казва чичо по въпроса:

A module is loaded only once, i.e, a second import statement will neither re-execute the code inside the module (see Python reload statement in the reference guides), nor will it re-create the corresponding namespace.

Include_once и require_once на php май са на същия принцип. Рече и отсече - после не повтаря :)

редактиран от insecteater на 06.04.09 22:47
кака.лара
Вто, 07.04.09, 12:14
Долу-горе така.
На етапа на компилацията компилаторът създава списък на използваните модули. Това е обикновена променлива-речник, обект от тип dict. В нея се записват имената на вградените модули и имената на допълнително импортираните модули. Всеки модул има такава променлива с име __dict__. Пробвай от интерактивния режим да дадеш това:

import sys
sys.__dict__

и гледай какво става
После на етапа на изпълнението интерпретаторът използва тази променлива, за да постави в нея указател към всеки отделен модул, след като го импортира. При повторен опит да се импортира същият модул става толно същото, каквото става при повторно дефиниране артикул в променлива-речник. Нищо не става
Опитай от интерактивния това:

d={}
d['a'] = 1
d['b']= 2
# и сега пак
d['a'] = 1

Какво се случва? Точно същото е при повторно импортиране. На интерпретатора му е все тая модули ли има в __dict__-променливата или картофи.

angelicstar
Вто, 07.04.09, 16:20
Много мерси на всички!
Това е много як номер да използват речник. Значи мога да си бърникам направо в организацията на импорта. Това ме кефи на Питона. Едно вземаш, 10 получаваш бонус.
***
ред: Ами значи да ми зацикли трябва преди импорта да ги зачиствам от __dict__
редактиран от angelicstar на 07.04.09 16:29
кака.лара
Чет, 09.04.09, 10:43
Е, ха пробвай със зачистване на речника и после кажи.

Ще бъде много интересно да излезе нещо.

Изобщо да бърникаш в системните променливи не е забранено, но е тъпа идея.
angelicstar
Пон, 13.04.09, 15:18
Ами и през __dict__ не става да го зацикля.
Много яко са го измислили. Преди импорта няма какво да изчистиш от речника а след импорта вече става късно. И с reload пак същото.
Накрая го зациклих, ама трябваше да пиша явно цикъла.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.