Столкновение имени импорта Python

1

Когда у меня есть пакетный test, я привык импортировать из него еще один script файла:

import test.script

и библиотеки:

import library

Это работает до тех пор, пока мне не нужна библиотека, имя которой соответствует любому из моих сценариев. Когда это происходит, скрипт загружается, а не библиотека. Есть ли способ заставить локальный импорт использовать полный путь к файлу, когда я его использую? Или есть другой способ предотвратить столкновение имен, не переименовывая скрипт?

Теги:
python-import

1 ответ

1

Когда вы называете "скрипт" с тем же именем, что и зависимость, вы перехватили поиск этого имени.

Вы можете изменить свой PYTHONPATH ie sys.path, помещая ваши зависимости перед вашими "скриптами", но затем вы перехватили свои скрипты - это кажется очень плохой идеей.

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',                               # Current Working Directory
 '~\\Anaconda3\\python36.zip',
 '~\\Anaconda3\\DLLs',
 '~\\Anaconda3\\lib',
 '~\\Anaconda3',
 '~\\Anaconda3\\lib\\site-packages',
 '~\\Anaconda3\\lib\\site-packages\\Sphinx-1.5.6-py3.6.egg',
 '~\\Anaconda3\\lib\\site-packages\\win32',
 '~\\Anaconda3\\lib\\site-packages\\win32\\lib',
 '~\\Anaconda3\\lib\\site-packages\\Pythonwin',
 '~\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.6.egg']

Не изменяйте порядок поиска в вашем sys.path.

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

Пространства имен - одна хорошая идея - пусть больше таких!

Вам нужно собственное пространство имен. Создайте каталог, например a_namespace, поместите свои скрипты в этот каталог и работайте из родительского каталога. Например:

>>> from pathlib import Path
>>> Path('a_namespace').mkdir()
>>> (Path('a_namespace') / 'sys.py').write_text('print("importing my sys")')
25
>>> import a_namespace.sys
importing my sys

И вы все равно можете добраться до своих зависимостей:

>>> import sys
>>> sys.version
'3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]'
  • 0
    Таким образом, в основном, я должен положить что-нибудь, что может вызвать конфликт имен в какой-то дочерний пакет?
  • 0
    @Fido Поскольку вы, вероятно, не знаете всех своих зависимостей, я настоятельно рекомендую поместить ваши «сценарии» в пакет. Масштабные разработки, с которыми я знаком, делают это. Не обязательно , но единственное исключение, о котором я могу подумать, это проекты, которые привязаны к одному файлу (например, бутылке). Чем больше файлов вы создаете, тем больше у вас шансов столкновения имен. Используйте пакет пространства имен, по крайней мере. Это похоже на лучшую практику, и я не видел ни одной крупномасштабной разработки, которая бы этого не делала.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню