относительный import_module, не зная имени содержащейся упаковки - PullRequest
0 голосов
/ 23 апреля 2020

Предположим, что пакет структурирован так:

package/
        __init__.py
        __main__.py
        foo.py
        bar.py

__main__.py в настоящее время имеет что-то вроде

import argparse

from . import foo
from . import bar

def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()
    foo.init_subparser(subparsers.add_parser('foo', help=foo.__doc__)
    bar.init_subparser(subparsers.add_parser('bar', help=bar.__doc__)
    ...

Реальная программа имеет гораздо больше модулей подкоманд, поэтому я хочу сделать это менее повторяющийся при переключении на al oop с динамическим импортом c, что-то вроде

import argparse
import importlib

SUBCOMMANDS = ['foo', 'bar']

def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()
    for cmd in SUBCOMMANDS:
        mod = importlib.import_module('.'+mod, 'package')  # XXX
        mod.init_subparser(subparsers.add_parser(cmd, help=mod.__doc__)
    ...

Это прекрасно работает , но сейчас, в точке, отмеченной XXX во втором фрагменте кода, Я должен знать и передать название пакета, что необязательно с from . import module.

Итак, вопрос в том, как я могу выполнить эти относительные импорты Dynami c без необходимости вставлять имя пакета в мой код?

2.x совместимость не требуется.

...