Pip -e: нет магии, подчеркивающей замену тире
Где-то символы подчеркивания меняются на тире, если вы устанавливаете с помощью репозитория git с "pip install -e...".
Есть ли способ остановить это?
Я хочу автоматизировать вещи. Я хочу, чтобы repo foo_bar
был ~/src/foo_bar
, а не ~/src/foo-bar
.
Ответы
Ответ 1
Из того, что я вижу из этот вопрос и этот ответ в списке рассылки Python, похоже, что это связано с многочисленными соглашениями об именах во всей системе упаковки Python и совместимостью между ними.
Pythons setuptools
запускает safe_name
, который:
Преобразование произвольной строки в стандартное имя рассылки
Любые пробеги не буквенно-цифровых/. символы заменяются одним "-".
Несмотря на то, что pip
, easy_install
и PyPi
могут принимать знак подчеркивания, при установке он изменяется на один стандарт "-" для setuptools.
Ответ 2
Как примечание, чтобы объяснить, почему подчеркивания преобразуются в дефисы, setuptools
реализация safe_name
не является произвольным: это соответствует PEP 503, в котором говорится:
Нормализованные имена
Этот PEP ссылается на концепцию "нормализованного" имени проекта. Согласно PEP 426 только допустимые символы в имени являются ASCII алфавита, цифры ASCII, .
, -
и _
. Имя должно быть в нижнем регистре со всеми символами .
, -
или _
заменены одним -
характером. Это может быть реализовано в Python с помощью модуля re
:
import re
def normalize(name):
return re.sub(r"[-_.]+", "-", name).lower()
Обратите внимание, что здесь используется слово "прогоны" для обозначения 1 или более вхождений, а не 2 или более вхождений. Глядя на соответствующий раздел в Приложении D: Отложенные функции PEP 426, мы находим:
Запрещение подчеркивания в именах дистрибутивов
На самом деле Debian не допускает подчеркивания в именах, но это кажется чрезмерно ограничительным для данной спецификации, учитывая обычную практику использования допустимых идентификаторов Python в качестве имен дистрибутивов Python. Политика Debian на стороне преобразования подчеркиваний в дефисы кажется достаточно простой для реализации (а требование рассматривать дефисы и подчеркивания как эквивалентные гарантирует, что это не приведет к конфликтам имен).
Для обеспечения максимальной перекрестной совместимости и удобства использования, вероятно, лучше всего придерживаться букв и цифр ASCII, поскольку пакеты с дефисами в их имени не могут быть импортированы. *
* Это не совсем верно, так как у меня есть несколько пакетов, которые имеют тире, но они позволяют импортировать, используя подчеркивание.Я не уверен, как они работают.
Ответ 3
Обратите внимание, что ответ выше неверен. Точное регулярное выражение из кода - re.sub('[^A-Za-z0-9.]+', '-', name)
. Но если вы попробуете pip install foo!bar
вы получите большую ошибку разбора, так что это тоже не совсем так.