Преимущества os.path.splitext по регулярному .split?

Когда вы связываете свою службу БД с веб-службой в Docker, вы должны использовать имя вашей службы БД вместо ip сервера базы данных для подключения базы данных:

db:
    image: mysql
    restart: unless-stopped
    container_name: db_of_my_project

web:
    build: .
    container_name: django01
    command: ...
    links:
        - db
    volumes:
        - ./project:/src
    expose:
        - "8000"
    restart: always

и конфигурацию вашей базы данных:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'ProjetDjango',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'db',  #  database container name
        'PORT': '',
    }
}
37
задан Community 23 May 2017 в 12:10
поделиться

10 ответов

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

<час>

Редактирование : @Brian комментирует, что пример как /directory.ext/file, конечно, не работал бы с простым .split('.') вызов, и необходимо будет знать оба, что каталоги могут использовать расширения, а также то, что в некоторых операционных системах, наклонная черта вправо является допустимым разделителем каталога.

Это просто подчеркивает эти , используют библиотечную подпрограмму, если у Вас нет серьезного основания не к часть моего ответа.

Спасибо @Brian.

<час>

Кроме того, где файл не имеет расширения, необходимо было бы создать в логике для обработки того случая. И что, если вещь Вы пытаетесь разделить имя каталога, заканчивается обратной косой чертой? Никакое имя файла, ни расширение.

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

39
ответ дан Community 27 November 2019 в 04:34
поделиться

splitext() делает обратный поиск '.' и возвращает дополнительную часть, как только она находит его. split('.') сделает вперед поиск всех '.' символов и поэтому почти всегда медленнее. Другими словами splitext() конкретно записан для возврата расширения, в отличие от этого split().

(см. posixpath.py в источнике Python, если Вы хотите исследовать реализацию).

10
ответ дан codelogic 27 November 2019 в 04:34
поделиться

os.path.splitext правильно обработает ситуацию, где файл не имеет никакого расширения, и возвратите пустую строку. .split возвратит название файла.

14
ответ дан Andrew Grant 27 November 2019 в 04:34
поделиться

Там существуйте операционные системы, которые не используют †˜. ’ как дополнительный разделитель.

(В частности, RISC ОС условно использует †˜/’, с тех по𠆘. ’ используется там в качестве разделителя пути.)

6
ответ дан bobince 27 November 2019 в 04:34
поделиться

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

Редактирование: Это не конкретный язык.

2
ответ дан Allen Rice 27 November 2019 в 04:34
поделиться

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

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

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

1
ответ дан DevelopingChris 27 November 2019 в 04:34
поделиться
  1. инструмент Right для правильного задания
  2. Уже полностью отлаженный и протестированный как часть библиотеки стандарта Python - никакие ошибки, представленные ошибками в Вашей скрученной вручную версии (например, что, если нет никакого расширения, или файл скрытый файл на UNIX как '.bashrc', или существует несколько расширений?)
  3. Разрабатываемый с этой целью, функция имеет полезные возвращаемые значения (базовое имя, расширение) для имени файла передал, который может быть более полезным в определенных случаях по сравнению с необходимостью разделить путь вручную (снова, пограничные случаи могли быть беспокойством при выяснении базового имени - расширение)

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

2
ответ дан Jay 27 November 2019 в 04:34
поделиться

В комментарии к ответу, который предоставил это решение:

, "Если файл не имеет никакого расширения, это неправильно возвращает имя файла вместо пустой строки".

Не каждый файл имеет расширение.

0
ответ дан chryss 27 November 2019 в 04:34
поделиться

Помимо того, чтобы быть стандартным и поэтому гарантируемым быть доступным, os.path.splitext:

пограничные случаи Дескрипторов - как этот недостающего расширения.
гарантии Предложений - Помимо корректного возврата расширения, если Вы существуете, это гарантирует, что root + ext будет всегда возвращать полный путь.
межплатформенный - в источнике Python существует на самом деле три других версии os.path, и их называют, на основе которой операционной системы Python думает, что Вы идете.
, больше читаемое - полагает, что Ваша версия требует, чтобы пользователи знали, что массивы могут быть индексированы с отрицательными числами.

btw, это не должно быть немного быстрее.

0
ответ дан Triptych 27 November 2019 в 04:34
поделиться

1) простое разделение ('. '), [-1] не будет работать правильно на путь как C:\foo.bar\Makefile so you need to extract basename first with os.path.basename (), и даже в этом случае он не разделит файл без расширения правильно. os.path.splitext делают это под капотом.

2) Несмотря на факт os.path.splitext является межплатформенным решением, это не идеально. Позвольте нам смотрящий на специальные файлы с продвижением точки, например, .cvsignore, .bzrignore, .hgignore (они очень популярны в некотором VCS как специальные файлы). os.path.splitext возвратит все имя файла как расширение, хотя это не делает кажется правильным для меня. Поскольку на это имя случая без расширения пустая строка. Хотя это - предназначенное поведение библиотеки стандарта Python, это, может быть не то, что пользователь хочет на самом деле.

0
ответ дан bialix 27 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: