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 вы получите большую ошибку разбора, так что это тоже не совсем так.