Создание импортируемого пакета / модуля Python 3

#python #module #package

#python #модуль #пакет

Вопрос:

У меня возникли проблемы с созданием импортируемого пакета / библиотеки / модуля Python или любой другой правильной номенклатуры. Я использую Python 3.7

Файловая структура, которую я использую, является:

 Python37//Lib//mypackage

mypackage
    __init__.py
    mypackage_.py
  

Код в __init__.py :

 from mypackage.mypackage_ import MyClass
  

Код в mypackage_.py :

 class MyClass:
    def __init__(self, myarg = None):
        self.myvar = myarg
  

И с моего рабочего стола я пытаюсь запустить следующий код:

 import mypackage

x = MyClass(None)
  

Но появляется следующая ошибка:

 Traceback (most recent call last):
  File "C:Users***Desktopimporttest.py", line 3, in <module>
    x = MyClass(None)
NameError: name 'MyClass' is not defined
  

Комментарии:

1. Не помещайте свой модуль в библиотеку python37. Это плохая практика. Скорее просто добавьте свой путь к модулю в pythonpath.

Ответ №1:

Вы не импортировали имя MyClass в свое текущее пространство имен. Вы импортировали mypackage . Чтобы получить доступ к чему-либо внутри mypackage , вам нужно добавить к имени префикс mypackage.<Name>

 import mypackage

x = mypackage.MyClass(None)
  

Ответ №2:

Как говорит @rdas, вам нужно добавить к имени префикс mypackage.<Name> .

Я не рекомендую этого делать, но вы можете импортировать подстановочные знаки, чтобы x = MyClass(None) работать:

 from mypackage import *
  

Теперь все из mypackage импортируется и может использоваться в текущем пространстве имен. Однако вы должны быть осторожны с импортом подстановочных знаков, потому что они могут создавать конфликты определений (если несколько модулей имеют одно и то же имя для разных объектов).