Работа с несколькими файлами и папками кода в Python

Я новичок в Python, и я не понял простой способ разделения кода в нескольких файлах и папках кода.

То, что я делаю сегодня, - это: для каждой папки я создаю файл __init__.py. Иногда он пуст. Я не знаю, почему я это делаю, но это кажется необходимым. Это первое отличие от работы с С#.

Второе отличие состоит в том, что для любого файла, который будет ссылаться на любой другой, я должен использовать импорт, например from model.table import Table. И если у меня есть несколько ссылок, мне нужно использовать несколько импорта:

from model import table1,table2

а затем в остальной части кода я должен использовать table1.Table1 для примера. Если я не хочу, я должен

from model.table1 import Table1
from model.table2 import Table2

а затем я могу просто использовать Table1

Это слишком сильно отличается от того, к чему я привык, в С#, где, если все файлы находятся в одном и том же пространстве имен, нам не нужно было import. Есть ли более простой способ для меня?

Ответ 1

Вы должны прочитать модули: http://docs.python.org/tutorial/modules.html

В принципе, я думаю, что вы не правильно упорядочиваете свой код. С python, каталоги и файлы имеют смысл; это не только то, что вы пишете в файлы. С каждым новым каталогом (с __init__.py) и каждым новым файлом вы создаете новое "пространство имен"...

Если у вас есть файл /mydatabase/model.py и Table1, Table2 и т.д., определенные в этом файле model.py, вы можете просто:

from mydatabase.model import *

Не создавайте новый файл для каждого класса Table!

Ответ 2

Система импорта python довольно похожа на пространство имен С# из того, что я понимаю. Вы можете настроить поведение импорта модулей в __init__.py, если хотите. Вы также можете использовать import * или from x import *, чтобы вывести все общедоступные объекты, определенные модулем, в текущее пространство имен.

Рассмотрим в С#:

using System;
Console.WriteLine("hello world!");

В python вы можете сделать (используя эту полностью надуманную ситуацию):

system/
system/__init__.py
system/console.py

В __init__.py:

import console

В system/console.py:

import sys

def write_line(s):
    sys.stdout.write(s)

Теперь в вашем коде python вы можете сделать:

from system import *
console.write_line('hello world!')

Однако это не считается хорошей идеей в Python. Для получения более подробной информации и хороших рекомендаций ознакомьтесь с этой статьей: http://effbot.org/zone/import-confusion.htm