2013-05-31 2 views
3

Я очень новичок в python и не уверен в некоторых вещах.Python, организующий небольшой проект/скрипт

  1. Должны ли классы быть в отдельных файлах?
  2. Имеется ли у стандартного скрипта основной метод? Если да, то как это работает, так как у меня есть основной метод, который не получает вызванный
  3. Где обычно находится тестовый каталог устройств и как он включает «тестируемые файлы»?
+0

Номер 1 является личным предпочтением, в отличие от Java, где я считаю необходимым, в python это не так. НО из того, что я видел, большинство людей вкладывают все свои классы в один файл, просто для упрощения импорта. я предпочел бы импортировать одну вещь и «импортировать класс», чем «import class1, class2, class3». – TehTris

+0

Номер 2 - это то, что вы хотите. Обычно люди будут выставлять 'if __name__ ==" __main__ ": go()' (или что бы их главная функция не вызывала) в конце их файла python, и это заставит его запускать 'go()', как только его двойная нажата или загружена из командной строки – TehTris

ответ

5

Много земли, чтобы покрыть здесь, вы могли бы быть лучше обслужены путем разделения этих точек на отдельные вопросы/запросы:)

  1. я сопротивляюсь классы расщепления на отдельные файлы без необходимости. Некоторые классы могут сильно зависеть от других, и мне (лично) нравится держать их в одном файле. Я считаю, что лучшим соглашением является создание файлов на основе функциональности, а не отдельного файла для каждого класса.

    Я много вдохнул работу из проектов Pocoo, таких как Flask и Jinja2. Источник Jinja2 обеспечивает отличный пример «пакетирование» некоторые связанные классы в файлах: Github

  2. Автономные скрипты обычно используют что-то вроде if __name__ == '__main__', чтобы проверить, выполняются непосредственно (например, python scriptname.py), а затем выполнить функцию обычно main() после (спасибо Майку за исправление моей ошибки).

    Чтобы не помочь в решении вашей проблемы main, я бы предложил показать код, который вы пытаетесь использовать.

  3. Есть много различных способов сделать это, но соглашение, как представляется, в tests, test, testsuite каталога внутри вашего проекта. Последняя часть этого вопроса становится довольно сложной, потому что импорт Python зависит от структуры/типа вашего проекта Python (это пакет Python - отдельная коллекция скриптов?) И ваш PYTHONPATH.

    This SO post - прекрасное место для начала, чтобы рассмотреть, где поставить ваши тесты, хотя общий ответ кажется «везде, где лучше для вас/вашей команды»:).

    В небольшом примечании я также хотел бы взглянуть в рамки тестирования Nose, поскольку он удаляет много шаблонов из тестирования с помощью Python.

+0

Это не метод '__main__'. Идиома - 'if __name__ == '__main __'', а затем вызывать мою функцию, часто называемую 'main()'. –

+0

@ MikeMüller Спасибо за исправление mike, я включил его в свой ответ. –

+0

+1 для рекомендации носа. –

2

Я отвечу на вопросы 1 и 2.

1) Это зависит от многого. Если ваши классы малы, тогда все в порядке, чтобы поместить их в один и тот же файл. Если они становятся большими, они обычно хранятся в отдельных файлах.
2) Нет, не обязательно быть основным методом. Тем не менее, для сценария, это могучая общая идиома:

def main(): 
    # Your code 

# At the bottom of the file 
if __name__ == '__main__': 
    main() 

Таким образом, ваш main получит только пробег, когда файл запускается как сценарий, но он не будет работать при импорте в качестве модуля , Python будет просто выполнять любой код, который он встречает не в функции при импорте модуля, поэтому это защитит вас, если вы захотите повторно использовать скрипт в качестве модуля позже.

Это просто идиома, main не имеет особого значения в python, поэтому вам не нужно называть это или что-то еще.

0
  1. Не нужно, но если класс используется несколькими другими файлами/классами, он должен.
  2. Это хорошая практика см What does <if __name__==“__main__”:> do?
  3. Python смотрит на $ PYTHONPATH, который представляет собой список каталогов, чтобы найти модули. Вы можете поместить модули в подкаталогах одного из этих каталогов и импортировать их с import directoryname.module.. Вы можете импортировать класс по from directoryname.module import ClassName.
Смежные вопросы