python import * 或其他级别的列表

use*_*880 6 python python-3.x

我正在尝试从另一个级别的模块中导入一些类。我可以输入所有类,但我试图动态地输入

如果我做:

from ..previous_level.module import *
    raise: SyntaxError: import * only allowed at module level
Run Code Online (Sandbox Code Playgroud)

来自 myapp 文件夹的相同内容:

from myapp.previous_level.module import *
    raise: SyntaxError: import * only allowed at module level
Run Code Online (Sandbox Code Playgroud)

所以我认为:

my_classes = ['Class_Foo', 'Class_Bar']
for i in my_classes:
    from ..previous_level.module import i
        raise: ImportError: cannot import name 'i'
Run Code Online (Sandbox Code Playgroud)

并且:

my_classes = ['Class_Foo', 'Class_Bar']
for i in my_classes:
    __import__('myapp').previous_level.module.y
    raise: AttributeError: module 'myapp.previous_level.module' has no attribute 'y'
Run Code Online (Sandbox Code Playgroud)

我试过string formatgetattr()__getattr__但没有成功。

以这种方式导入是不可能的,或者我做错了什么?

zvo*_*one 7

SyntaxError: import * only allowed at module level如果您尝试*从函数内部导入,则会发生错误。从问题中看不到这一点,但原始代码似乎类似于:

def func():
    from ..previous_level.module import *  # SyntaxError
Run Code Online (Sandbox Code Playgroud)

另一方面,在模块开头导入是有效的:

from ..previous_level.module import *      # OK
Run Code Online (Sandbox Code Playgroud)

也就是说,我仍然建议使用绝对导入而不使用*

from myapp.previous_level.module import ClassA, ClassB, ClassC

x = ClassA()

# or:

import myapp.previous_level.module

x = myapp.previous_level.module.ClassA()
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是完全错误的:

for i in my_classes:
    from ..previous_level.module import i
Run Code Online (Sandbox Code Playgroud)