Как мне работать с несколькими ветками git модуля python? - PullRequest
2 голосов
/ 05 декабря 2008

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

Позвольте мне уточнить одну гипотетическую ситуацию: Я говорю, что у меня есть модуль 'eggs' с подмодулями 'foo' и 'bar'. Компоненты в 'bar' используют код в foo, поэтому eggs / bar / a.py может 'import eggs.foo'.

Скажите, что 'eggs' находится в хранилище git. Я хочу попробовать некоторые изменения в 'foo', поэтому я копирую его. Проблема в том, что import import.foo в eggs / bar находит исходный репозиторий в PYTHONPATH, поэтому он использует старый foo вместо моего модифицированного.

Как мне настроить себя так, чтобы каждая копия модуля использовала свой собственный связанный 'foo'? Спасибо.

edit- Спасибо за указатель на относительный импорт. Я прочитал об этом и вижу, как его применить. Одна из проблем, с которыми я столкнулся при его использовании, заключается в том, что я создал довольно большую кодовую базу, и я не слишком аккуратен в этом, так что большинство модулей проводят быструю «самопроверку» под if __name__ == '__main__':, что от Я прочитал не играет с относительным импортом:

Другое решение, которое я смог найти в Google, - это намеренно манипулировать sys.path, что выглядит как еще более худший взлом. Есть ли другие возможности?

edit - Спасибо за предложения. Изначально я неправильно понял ветви git, так как указанные ветки - именно то, что я хочу. Тем не менее, раньше я не слышал об относительном импорте, так что спасибо за это. Я узнал что-то новое и могу использовать его.

Ответы [ 3 ]

3 голосов
/ 05 декабря 2008

Относительный импорт ( PEP 328 ) может помочь:

eggs/
  __init__.py
  foo.py
  bar.py

# foo.py
from __future__ import absolute_import
from . import bar

См. Как вы организовываете модули Python? для других опций.

EDIT:

Еще одним вариантом является использование предложений С.Лотта и Джима, т. Е. Реструктуризация вашего пакета для выделения части eggs.foo, используемой eggs.bar.a, и использования git для работы над экспериментальными ветками (см. Git Community). Книга ).

Вот пример:

$ git status
# On branch master
nothing to commit (working directory clean)

[просто чтобы убедиться, что все хорошо]

$ git checkout -b experimental
Switched to a new branch "experimental"

[работа над экспериментальным материалом]

$ git commit -a

[передать в экспериментальную ветку]

$ git checkout master
Switched to branch "master"

[работа в основной ветке]

$ git commit -a

Чтобы объединить изменения в основную ветку:

$ git merge experimental

См. Главу Основные ветвления и слияния из вышеприведенной книги.

1 голос
/ 05 декабря 2008

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

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

И, как указал С. Лотт, пусть небольшой рефакторинг тоже не повредит;)

1 голос
/ 05 декабря 2008

"скажем, у меня есть модуль 'eggs' с подмодулями 'foo' и 'bar'. Компоненты в 'bar' используют код в foo, поэтому eggs / bar / a.py может 'import eggs.foo' . "

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

У вас есть eggs.bar.a в зависимости от eggs.foo. Я предполагаю, что другие вещи на eggs зависят от eggs.foo. Кроме того, я подозреваю, что eggs.foo можно разбить на eggs.foo и eggs.quux, и все может быть проще.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...