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

StackOverflow https://stackoverflow.com/questions/236407

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

Python для крупномасштабных проектов

Языки, библиотеки и фреймворки не масштабируются.Архитектуры делают это.

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

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

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

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

В качестве заключения

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

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

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

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

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

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

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

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

мои 0,10 ЕВРО:

у меня есть несколько приложений на python в "производственном" состоянии.наша компания использует java, c ++ и python.мы разрабатываем с помощью eclipse ide (pydev для python)

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

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

КСТАТИ:

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

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

Пример:

class MyClass { }
class MyClassx extends MyClass { }

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top