Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Единичные тесты не являются заменой

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

my 0.10 EUR:

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

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

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

НА ПУТИ:

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

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

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


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

Ответ 5

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

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

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

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

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

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

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

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

Ответ 6

Несовместимые изменения в сигнатуре метода. Это не так много в Python, как в Java и С++.

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

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

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

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

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

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

Пример:

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

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

Пример:

class MyClass { }
class MyClassx extends MyClass { }

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

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

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

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

Ответ 7

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

Ответ 8

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

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