Проблема создания экземпляра класса в подкаталоге - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть модуль в подкаталоге, и когда я пытаюсь импортировать его, я получаю NameError: name foo is not defined. Когда я помещаю код класса прямо в файл __main__.py, он работает нормально. __init__.py файлы пусты.

Я пробовал все следующее с другими ошибками:

MyProject/
├── __init__.py
├── __main__.py
├── foo/
│   ├── bar.py
│   ├── __init__.py

bar.py

class Bar:
    def __init__(self):
        print( 'am here' )
        pass

__ main __. Py

from MyProject import foo
#from MyProject import bar # errors with cannot import bar from MyProject
#from foo import bar # errors with No module named foo

if __name__ == '__main__':
    w = Bar()

Возможно, есть лучший способ организовать это?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2019

Класс Bar находится в файле bar.py, поэтому я думаю, что вам нужно сделать

from MyProject.foo import bar
w = bar.Bar()

или

from MyProject.foo.bar import Bar
w = Bar()
0 голосов
/ 02 декабря 2019

Вы не поделились своим foo/__init__.py, но вы могли бы исправить ситуацию, добавив к нему что-то вроде этого:

from .bar import Bar

Это добавляет Bar к пространству имен foo и вызываетPython для поиска Bar, когда вы просто импортируете foo.

Однако, вам, вероятно, было бы неплохо взглянуть на несколько стандартных примеров написания пакета. Во-первых, вы, вероятно, не должны называть свой проект MyProject, так как это имя означает, что это класс (с TitleCase). Присвоение имени проекту еще больше запутывает проблему, так как кажется, что вы пишете пакет , поэтому my_package звучит примерно так.

0 голосов
/ 02 декабря 2019

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

from .foo.bar import Bar

или

from .foo import bar
w = bar.Bar()

или

import .foo
w = foo.bar.Bar() 

. перед именем пакета означает, что пакет заблокирован в том же каталоге с текущим файлом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...