Как я могу использовать Python для крупномасштабной разработки? - PullRequest
57 голосов
/ 25 октября 2008

Мне было бы интересно узнать о крупномасштабной разработке на Python и особенно о том, как вы поддерживаете большую базу кода?

  • Когда вы вносите изменения несовместимости в сигнатуру метода, как вы находите все места, где этот метод вызывается. В C ++ / Java компилятор найдет его для вас, как вы делаете это на Python?

  • Когда вы делаете изменения глубоко внутри кода, как вы узнаете, какие операции предоставляет экземпляр, поскольку у вас нет статического типа для поиска?

  • Как вы обрабатываете / предотвращаете ошибки ввода (опечатки)?

  • Используется ли UnitTest вместо статической проверки типов?

Как вы можете догадаться, я почти работал только со статически типизированными языками (C ++ / Java), но я хотел бы попробовать свои силы на Python для более крупных программ. Но у меня был очень плохой опыт, давным-давно, с языком clipper (dBase), который также был динамически типизирован.

Ответы [ 8 ]

62 голосов
/ 25 октября 2008

Не используйте отвертку в качестве молотка

Python не является статически типизированным языком, поэтому не пытайтесь использовать его таким образом.

Когда вы используете определенный инструмент, вы используете его для того, для чего он был построен. Для Python это означает:

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

  • Огромная стандартная библиотека . Вам не нужно менять все свои звонки в программе, если вы используете стандартные функции, которые вы сами не кодировали. И Питон идет с включенными батареями. Я продолжаю открывать их каждый день. Я понятия не имел о количестве модулей, которые я мог использовать, когда начинал, и пытался переписать существующие вещи, как все. Все нормально, с самого начала все не получается.

Вы не пишете Java, C ++, Python, PHP, Erlang, что угодно, одинаково. Это веские причины, по которым есть место для каждого из множества языков, они не делают одно и то же.

Модульные тесты не являются заменой

Юнит-тесты должны проводиться на любом языке. Самая известная библиотека модульных тестов ( JUnit ) из мира Java!

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

Python для крупных проектов

Языки, библиотеки и рамки не масштабировать Архитектура делает.

Если вы разрабатываете надежную архитектуру, если вы в состоянии сделать так, чтобы она быстро развивалась, то она будет масштабироваться. Помощь в модульных тестах, автоматическая проверка кода. Но они просто сети безопасности. И маленькие.

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

В огромном проекте вы, скорее всего, будете использовать несколько разных технологий. Как SGBD (французский для СУБД ) и язык шаблонов, или еще. Python не исключение.

Возможно, вы захотите использовать C / C ++ для той части кода, которая вам нужна для быстрой работы. Или Java для установки в Tomcat . Не знаю, все равно. Python может хорошо играть с ними.

В заключение

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

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

Если вы играли / хотите играть с Python, это здорово! Это замечательный инструмент. Но на самом деле просто инструмент.

36 голосов
/ 25 октября 2008

У меня был некоторый опыт работы с модификацией "Frets On Fire", клона Python с открытым исходным кодом "Guitar Hero".

На мой взгляд, Python не очень подходит для действительно масштабного проекта.

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

в дополнение к этому, вызов функций с использованием их строки имени со встроенной функцией __getattr__, как правило, более распространен в Python, чем в других языках программирования, таким образом, получить граф вызовов для определенной функции довольно сложно (хотя вы можете вызвать функции с их именами в некоторых статически типизированных языках).

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

22 голосов
/ 25 октября 2008

Поскольку никто не указал на pychecker, pylint и подобные инструменты, я сделаю следующее: pychecker и pylint - это инструменты, которые могут помочь вам найти неверные предположения (о сигнатурах функций, атрибутах объектов и т. Д.). Они не найдут всего, что может сделать компилятор найти в статически типизированном языке - но они могут найти проблемы, которые не могут найти такие компиляторы для таких языков.

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

16 голосов
/ 25 октября 2008

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

  • Структурируйте ваш код по слоям. т.е. отдельная логика бизнеса, логика представления и ваши уровни персистентности. Потратьте немного времени на определение этих уровней и убедитесь, что все участники проекта задействованы. Для больших систем создание среды, которая вынуждает вас к определенному пути развития, также может быть ключевым.

  • Тесты являются ключевыми, без модульных тестов вы, скорее всего, получите неуправляемую кодовую базу в несколько раз быстрее, чем с другими языками. Помните, что модульных тестов часто недостаточно, убедитесь, что у вас есть несколько интеграционных / приемочных тестов, которые вы можете быстро запустить после любого существенного изменения.

  • Использование Fail Fast принцип. Добавьте утверждения для случаев, когда вы считаете, что ваш код уязвим.

  • Имеет стандартное ведение журнала / обработку ошибок, которое поможет вам быстро перейти к проблеме

  • Используйте IDE (pyDev работает для меня), которая обеспечивает опережающий тип, интеграцию с pyLint / Checker, чтобы помочь вам сразу обнаружить общие опечатки и продвинуть некоторые стандарты кодирования

  • Внимательно относитесь к своему импорту, никогда не делайте из x import * и не делайте относительный импорт без использования.

  • Рефакторинг, инструмент поиска / замены с регулярными выражениями - часто все, что вам нужно, чтобы делать методы перемещения / рефакторинг типов классов.

16 голосов
/ 25 октября 2008

мои 0,10 евро:

У меня есть несколько приложений на Python в «производственном» состоянии. наша компания использует Java, C ++ и Python. мы развиваемся с помощью eclipse ide (pydev для python)

Юнитестесты являются ключевым решением проблемы. (также для c ++ и java)

менее безопасный мир "динамической типизации" сделает вас менее внимательным к качеству кода

ПУТЬ :

крупномасштабное развитие не означает, что вы используете один-единственный язык!

В крупномасштабных разработках часто используется несколько языков, специфичных для проблемы .

так что я согласен с проблемой молотка : -)


PS: статическая типизация и python

8 голосов
/ 25 октября 2008

Несовместимые изменения в сигнатуре метода. В Python это происходит не так часто, как в Java и C ++.

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

Как найти все места, где вызывается этот метод? grep работает для динамических языков. Если вам нужно знать каждое место, где используется метод, отлично работает grep (или эквивалентный поиск с поддержкой IDE).

Как узнать, какие операции предоставляет экземпляр, поскольку у вас нет статического типа для поиска?

а. Посмотрите на источник. У вас нет проблемы Java / C ++ с объектными библиотеками и файлами JAR, с которыми нужно бороться. Вам не нужны все сложные средства и инструменты, которые нужны этим языкам.

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

с. В Python вы часто работаете через интерактивного переводчика. В отличие от Java и C ++, вы можете исследовать свои экземпляры напрямую и в интерактивном режиме. Вам не нужна сложная IDE.

Пример: * * один тысяча двадцать-одна

  >>> x= SomeClass()
  >>> dir(x)

Как вы обрабатываете / предотвращаете ошибки ввода? То же, что и в статических языках: вы их не предотвращаете. Вы найдете и исправите их. Java может найти только определенный класс опечаток. Если у вас есть два одинаковых имени класса или переменной, вы можете столкнуться с серьезными проблемами, даже со статической проверкой типов.

Пример: * * тысяча двадцать-восемь

class MyClass { }
class MyClassx extends MyClass { }

Опечатка с этими двумя именами классов может привести к хаосу. [«Но я бы не поставил себя в такое положение с Java», - говорят люди. Согласовано. Я бы тоже не поставил себя в такое положение с Python; вы делаете классы, которые сильно отличаются друг от друга, и рано потерпят неудачу, если ими злоупотребят.]

Используется ли UnitTest вместо статической проверки типов? Вот другая точка зрения: статическая проверка типов заменяет простой и понятный дизайн.

Я работал с программистами, которые не знали, почему работает приложение. Они не могли понять, почему вещи не компилируются; они не знали разницы между абстрактным суперклассом и интерфейсом и не могли понять, почему изменение на месте приводит к сбою других модулей в отдельном JAR-файле. Статическая проверка типов дала им ложную уверенность в некорректном дизайне.

Динамические языки позволяют программам быть простыми. Простота заменяет статическую проверку типов. Ясность заменяет статическую проверку типов.

3 голосов
/ 25 октября 2008

Мое общее правило - использовать динамические языки для небольших не критически важных проектов и статически типизированные языки для больших проектов. Я считаю, что код, написанный на динамическом языке, таком как python, «запутывается» быстрее. Отчасти это связано с тем, что писать код на динамическом языке намного быстрее, что приводит к ярлыкам и худшему дизайну, по крайней мере, в моем случае. Отчасти это потому, что у меня есть IntelliJ для быстрого и легкого рефакторинга, когда я использую Java, чего у меня нет для python.

2 голосов
/ 25 октября 2008

Обычный ответ на это - тестирование, тестирование, тестирование. Вы должны иметь обширный набор модульных тестов и часто его запускать, особенно перед выходом в эксплуатацию новой версии.

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

...