Работа с несколькими файлами и папками кода в 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