Как встроить класс в модуль Python - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть файл класса fil1.py, и в этом файле есть только один класс с именем f. Я хочу встроить этот файл класса в модуль, для которого я пытался упорядочить свои файлы следующим образом:

foo/
 foo/
    __init__.py
    file1.py # where class resides
 setup.py
 README.md
 LICENSE

В __init__.py у меня есть одно предложение:

from file1 import f

Затем, когда я публикую sh на pypi, а затем устанавливаю обратно на мой локальный компьютер. Когда я пытаюсь:

from foo import f

Я получаю сообщение об ошибке:

ImportError: cannot import name 'f' from 'foo'

Я также пытался

import foo
foo.f

Сообщение об ошибке было:

foo has no attribute f

Я не уверен, как добиться того, чего я хочу.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Чтобы добиться абсолютного импорта из пакета foo, я переместил определение класса в py .py. См. Использование pip для установки пакета одного класса без импорта module.pyfile .

root/
 foo/
    __init__.py # where class resides
 setup.py
 README.md
 LICENSE

Тогда я могу сделать

from foo import f #f is the class previously in the file1.py
0 голосов
/ 10 февраля 2020

В Python не существует такого понятия, как "файл класса". Файл является модулем, и модули могут содержать ноль или более классов, функций или допустимых операторов python, не включенных в класс или функцию (которые запускаются только один раз при импорте модуля). Тем не менее, я думаю, что вы хотите:

foo / file1.py:

class f:
[...]

foo / __ init__.py:

from foo.file1 import f

тогда все следующие допустимо (при условии, что foo доступно для sys.path, что автоматически включает текущий рабочий каталог в качестве первой записи):

import foo
import foo.file1
from foo import f
from foo.file1 import f

foo - это пакет (поскольку он содержит __init__.py) с один модуль называется file1. В качестве альтернативы вы можете использовать относительный импорт внутри __init__.py:

from .file1 import f

, но это может запутаться и обычно не приветствуется в более крупных проектах.

...