Можно ли использовать тире в файлах Python при попытке импортировать их?

В основном, когда у меня есть файл python, например:

python-code.py

и используйте:

import (python-code)

интерпретатор дает мне синтаксическую ошибку.

Любые идеи о том, как это исправить? Имеются ли запреты в именах файлов python?

Ответ 1

Вы должны проверить PEP 8, Руководство по стилю для кода Python:

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

Так как имена модулей сопоставляются с именами файлов, а некоторые файловые системы не чувствительны к регистру и обрезают длинные имена, важно, чтобы имена модулей были достаточно короткими - это не будет проблемой для Unix, но это может быть проблемой, когда код переносится на старые версии для Mac или Windows или DOS.

Другими словами: переименуйте свой файл:)

Ответ 2

Еще одна вещь, которая стоит отметить в вашем коде, заключается в том, что импорт не является функцией. Поэтому import(python-code) должен быть import python-code, который, как уже отмечалось, интерпретируется как "import python минус-код", а не то, что вы намеревались. Если вам действительно нужно импортировать файл с тире в его имени, вы можете сделать следующее::

python_code = __import__('python-code')

Но, как упоминалось выше, это не рекомендуется. Вы должны изменить имя файла, если оно что-то контролирует.

Ответ 3

TL;DR

Черточки не являются незаконными, но вы не должны использовать их по 3 причинам:

  1. Вам нужен специальный синтаксис для импорта файлов с тире
  2. Никто не ожидает имя модуля с тире
  3. Это вопреки рекомендациям Python Style Guide

Если вам определенно необходимо импортировать имя файла с тире, специальный синтаксис такой:

module_name = __import__('module-name')

Любопытно, почему нам нужен специальный синтаксис?

Причиной особого синтаксиса является то, что когда вы пишете import somename вы создаете объект модуля с идентификатором somename (чтобы позже вы могли использовать его, например, с somename.funcname). Конечно, module-name не является допустимым идентификатором и, следовательно, специальным синтаксисом, который дает правильный.

Вы не понимаете, почему имя модуля не является допустимым идентификатором?

Не волнуйся, я тоже. Вот подсказка, чтобы помочь вам: Посмотрите на эту строку Python: x=var1-var2. Вы видите вычитание справа от присваивания или имя переменной с тире?

PS

Ничего оригинального в моем ответе, кроме того, что я считаю наиболее релевантной информацией из всех других ответов в одном месте

Ответ 4

Проблема заключается в том, что python-code не является идентификатором. Парсер видит это как python минус code. Конечно, это не будет делать то, что вы просите. Вам нужно будет использовать имя файла, который также является допустимым идентификатором python. Попробуйте заменить символ - на символ подчеркивания.

Ответ 5

Вероятно, вы можете импортировать его через какой-то трюк __import__, но если вы еще не знаете, как это сделать, не следует. Имена модулей Python должны быть допустимыми именами переменных ( "идентификаторы" ) - это означает, что если у вас есть модуль foo_bar, вы можете использовать его из Python (print foo_bar). Вы не сможете сделать это со странным именем (print foo-bar → синтаксическая ошибка).

Ответ 6

На Python 3 используйте import_module:

from importlib import import_module
python_code = import_module('python-code')

В более общем смысле,

import_module('package.subpackage.module')

Ответ 7

Хотя правильное именование файлов - лучший способ, если python-code не находится под нашим контролем, взлом с использованием __import__ лучше, чем копирование, переименование или иное возложение с кодом других авторов. Однако я попытался, и это не сработало, если я не переименовал файл, добавив расширение .py. Посмотрев на документ, чтобы узнать, как получить описание для .py, я получил следующее:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

Он создал новый файл python-codec при первом запуске.