2012-07-01 3 views
4

Я только начинаю использовать движок Google для рекламы и искал хорошую практику и организацию кода. Большинство моих проблем связаны с путаницей __init__.py.Как организовать код с __init__.py?

Моя текущая структура теста выглядит

/website 
    main.py 
    /pages 
    __init__.py #1 
    blog.py 
    hello2.py 
    hello.py 
    /sub 
     __init__.py #2 
     base.py 

Я пытаюсь использовать main.py как файл, который просто указывает на все в/страниц и/страниц/суб. Большинство модулей в/страницах имеют почти все одинаковые импорты (например, import urllib), есть ли способ определить, что все в/pages импортирует то, что я хочу, а не добавляю его в каждый отдельный модуль?

В настоящее время в __init__.py # 1 У меня есть

from sub.base import * 

Еще мой модуль blog.py говорит BaseHandler (функция в base.py) не определено. Моя конечная цель иметь что-то вроде ...

main.py 
from pages import * 
#be able to call any function in /pages without having to do blog.func1() or hello.func2() 
#rather just func1() and func2() 

И чтобы иметь возможность совместно использовать общий импорт модулей в /pages в __init__.py. Чтобы они делили, например, urllib и все функции с base.py. Спасибо, что нашли время, чтобы прочитать это сообщение, я с нетерпением жду вашего понимания.

+0

Элементы, импортированные в '__init__', также автоматически не доступны для модулей в одном пакете. Вам все равно придется явно импортировать «BaseHandler» там, где это необходимо, например, в blog.py. –

ответ

3

Похоже, вы думаете, что __init__.py является инициализатором для других модулей в пакете. Это не. Он превращает pages в пакет (позволяя его файлы и подкаталоги быть модулями), и он выполняется, как и обычный модуль, когда ваша программа вызывает import pages. Представьте, что вместо этого он назван pages.py.

Так что, если вы действительно хотите сбросить все в том же пространстве имен, инициализации # 2 может содержать from base import * (который будет импортировать все в base к пространству имен sub), и blog.py может содержать from sub import *. Понял?

+0

Спасибо за разъяснение с целью __init__.py и наград на примере! Помогает много, теперь я получаю функциональность, которую я хотел. Я должен поиграть с ним больше, чтобы на самом деле обвести вокруг себя голову, но ты поставил меня в правильном направлении. – Miles

Смежные вопросы