Можно ли использовать тире в файлах Python при попытке их импорта? - PullRequest
120 голосов
/ 17 апреля 2009

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

python-code.py

и использование:

import (python-code)

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

Есть идеи как это исправить? Недопустимы ли тире в именах файлов python?

Ответы [ 7 ]

140 голосов
/ 17 апреля 2009

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

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

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

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

107 голосов
/ 18 апреля 2009

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

python_code = __import__('python-code')

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

35 голосов
/ 15 июня 2016

TLDR

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

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

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

module_name = __import__('module-name')

Вам интересно, зачем нам нужен специальный синтаксис?

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

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

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

PS

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

25 голосов
/ 17 апреля 2009

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

4 голосов
/ 17 апреля 2009

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

0 голосов
/ 24 мая 2019

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

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

В общем,

import_module('package.subpackage.module')
0 голосов
/ 29 сентября 2018

Хотя правильное присвоение имен файлам является наилучшим способом, если 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 при первом запуске.

...