Импорт * в Python 3.7 с использованием файла __init__.py - PullRequest
0 голосов
/ 24 сентября 2018

Прежде всего, вот моя структура каталогов:

Root
   - models 
        car.py 
        __init__.py 
   hello.py 

Внутри __init__.py У меня есть следующее:

__all__ = ["car"]

Внутри hello.py Я пытаюсь импортировать все из моделейпапка:

from models import *

car = Car()

Это дает мне ошибку:

Traceback (most recent call last):
  File "hello.py", line 4, in <module>
    car = Car()
NameError: name 'Car' is not defined

Что я делаю не так?

Ответы [ 5 ]

0 голосов
/ 24 сентября 2018

__all__ просто контролирует то, что будет экспортироваться, используя * в текущей области.

В вашем случае, Car не входит в область действия __init__.py.Так что это бессмысленно.

Чтобы решить эту проблему, вам нужно импортировать Car в область действия __init__.py, вот и все.

Я понимаю, что вы думаете, просто используя __all__, вы можете напрямую получить доступ к классу в car.py, но это не так.__all__ ничего не делает, кроме управляет экспортом в текущей области .

0 голосов
/ 24 сентября 2018

Вы пропустили там один шаг.

Попробуйте:

from models import *

car = car.Car()

Или попробуйте:

from models.car import *

car = Car()
0 голосов
/ 24 сентября 2018

Если вы хотите, чтобы класс Car был непосредственно доступен в hello.py после того, как вы сделали from models import *, в файле __init__.py, поместите from models.car import Car.

__all__ нас другой стороны, обычно перечисляет имена модулей , как у вас выше.Вы можете изменить hello.py следующим образом, и ваш текущий __init__.py, состоящий из __all__ = ["car"], будет работать:

from models import *
car_obj = car.Car() # Reference module.class instead of just the class
0 голосов
/ 24 сентября 2018

Из python docs :

, если код __init__.py пакета определяет список с именем __all__, он считается списком имен модулей, которые должныбыть импортированным при обнаружении from package import *.

Это означает, что ваш hello.py только что импортировал модуль car в свое пространство имен, не класс Car.Поэтому это будет работать.

from models import *
auto = car.Car()
0 голосов
/ 24 сентября 2018

Вам нужно будет указать, какой класс вы хотите импортировать в атрибут __all__ вашего __init__.py файла.Ниже приведен пример:

from car import *
__all__ = ["Car"]
...