Есть ли инструмент, который удаляет функции, которые не используются в Python?

У меня есть следующая ситуация: я работаю над несколькими проектами, которые используют библиотечные модули, которые я написал. Библиотечные модули содержат несколько классов и функций. В каждом проекте используется некоторое подмножество кода библиотек.

Однако, когда я публикую проект для других пользователей, я хочу только отдать код, который используется этим проектом, а не целые модули. Это означает, что я хотел бы, для данного проекта, удалить неиспользуемые библиотечные функции из кода библиотеки (т.е. Создать новую уменьшенную библиотеку). Есть ли какой-нибудь инструмент, который может сделать это автоматически?

ИЗМЕНИТЬ

Некоторые пояснения/ответы:

  • Относительно ответов "вы не должны этого делать вообще": Суть в том, что на практике, прежде чем я опубликую проект, я вручную просматриваю библиотечные модули и удаляю неиспользуемый код. Поскольку мы все программисты, мы знаем, что нет причин делать что-то вручную, когда вы можете легко объяснить компьютеру, как это сделать. Так что практически, писать такую ​​программу можно и не должно быть слишком сложно (да, это может быть не супер общий). Мой вопрос состоял в том, что кто-то знает, существует ли такой инструмент, прежде чем я начну думать о его реализации. Кроме того, любые мысли о реализации этого приветствуются.
  • Я не хочу просто скрыть весь мой код. Если бы я хотел сделать это, я бы, вероятно, не использовал Python. На самом деле, я хочу опубликовать исходный код, но только код, который имеет отношение к рассматриваемому проекту.
  • Относительно комментариев "вы защищены законом": в моем конкретном случае юридическая/лицензионная защита мне не помогает. Кроме того, проблема здесь более общая, чем некоторая кража кода. Например, это может быть для ясности: если кому-то нужно использовать/разрабатывать код, вы не хотите включать в него десятки нерелевантных функций.

Ответ 1

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

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

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

В любом случае, я думаю, что для того, чтобы действительно создать инструмент, который точно определяет весь код, который используется в вашем текущем коде, вам нужно сделать полный охват unit test вашего кода, или вы будете действительно методичны в том, как вы импортируете код модуля (используя только from foo import bar и избегая цепочки импорта между модулями).

Ответ 2

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

Ответ 3

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

Тем не менее, у нас есть лицензии по какой-то причине. Вы помещаете минимальный заголовок и свою атрибуцию в верхнюю часть каждого файла, и вы распространяете файл LICENSE с вашим программным обеспечением, который четко указывает, что люди, и не имеют, разрешено делать с вашим исходным кодом. Если они нарушают это, и вы их поймаете, у вас теперь есть законные права. ЕСЛИ вы не доверяете людям, чтобы отстаивать эту лицензию: что вся причина там. Если ваш код настолько уникален, что его нужно лицензировать, опасаясь, что другие передадут его как свои собственные, легко будет найти нарушения. Если, однако, вы относитесь ко всему вашему коду, как это, небольшая проверка реальности: вы не так хороши. Почти ничего, что вы пишете, будет достаточно оригинальным, чтобы другие еще не написали его, пытаясь цепляться за него, не принесет вам пользы или кого-либо еще.

Лучшая защита кода? Держите его онлайн, чтобы все могли видеть, чтобы вы могли указать всем остальным на него и пойти "видеть" мой код. И этот рывок использует его в собственном продукте, не давая мне кредитов ". Хуже того, защита кода, но все же защита: не распространяйте код, распространяйте скомпилированные библиотеки. (Наихудший код защиты: распространение gimped кода, потому что вы боитесь мира по неправильным причинам)