Импорт типов в динамически загружаемых модуляхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Импорт типов в динамически загружаемых модулях

Сообщение Anonymous »

Я хочу динамически загружать модуль из пакета и импортировать объекты из пакета в этот модуль. Однако я получаю несогласованность в пространствах имен относительно типов.
Мои файлы пакета находятся в каталоге pkg:

Код: Выделить всё

pkg:
__init__.py, main.py, commands.py, queries.py
и загружаемый модуль run.py находится в другом месте,

Код: Выделить всё

my_directory
. — основной модуль, он динамически загружает run.py:

Код: Выделить всё

import importlib.util
import sys

script_file = 'my_directory/run.py'
spec = importlib.util.spec_from_file_location('my_script', script_file)
mod = importlib.util.module_from_spec(spec)
sys.modules[script_file] = mod
spec.loader.exec_module(mod)

Код: Выделить всё

commands.py:
from queries import report, Format

def list_data(fmt: Format = Format.ASCII):
report(fmt)

Код: Выделить всё

queries.py:
from enum import auto, Enum

class Format(Enum):
ASCII = auto()
PYTHON = auto()

def report(fmt):
if fmt == Format.PYTHON:
print('Format is Python')
else:
print('Same values:', fmt == Format.PYTHON)
print('Same types:', type(fmt) == type(Format.PYTHON))
print(f'Formats: {fmt}, {Format.PYTHON}')
print('Module of Format:', Format.__module__)
print('Module of fmt:', fmt.__module__)

Код: Выделить всё

___init.py:
from .queries import Format
from .commands import list_data
и run.py:

Код: Выделить всё

from pkg import list_data, Format

list_data(Format.PYTHON)
Я ожидал, что будет напечатан Format is Python, но выполняется ветвь else, и я получаю следующий вывод:

Код: Выделить всё

Same values: False
Same types: False
Formats: Format.PYTHON, Format.PYTHON
Module of Format: queries
Module of fmt: pkg.queries
что указывает на то, что типы Format.PYTHON имеют разные пространства имен и не сравниваются.
Как мне изменить свой код, чтобы получить ожидаемое поведение?
Прошу прощения за длинное описание, но мне не удалось воспроизвести проблему на меньшем примере.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ed-modules
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Импорт типов в динамически загружаемых модулях
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Импорт типов в динамически загружаемых модулях
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Импорт типов в динамически загружаемых модулях
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Использование итерации/списка/генератора динамически загружаемых приспособлений pytest
    Anonymous » » в форуме Python
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Совместно ли процессы используют разделы обычных динамически загружаемых библиотек, доступные только для чтения?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»