【问题标题】:Is it possible to get a list of imported things from a module in Python?是否可以从 Python 中的模块获取导入内容的列表?
【发布时间】:2020-08-08 14:32:16
【问题描述】:

是否可以从模块中获取导入类的列表?

我的代码是这样的:

from .models import Food, Drink, Topping

for m in (Food, Drink, Topping):
    admin.site.register(m)

我总是需要重复导入的元素。

是否可以这样做:

from .models import Food, Drink, Topping

for m in list_of_things_imported_from[".models"]:
    admin.site.register(m)

我尝试在 google 和 SO 上查找,但没有得到很好的结果。

【问题讨论】:

  • 我希望这个链接对你有帮助。 stackoverflow.com/questions/1796180/…
  • 之前的评论建议使用 dir(),但是 dir() 首先返回一个字符串数组,然后我将有从字符串中获取类的开销,其次它返回更多的东西,不仅仅是从 .models 导入的东西。

标签: python python-3.x django


【解决方案1】:
import inspect
import test_module # module to be inspected

for name, data in inspect.getmembers(test_module):
    if name.startswith("__"):
        continue
    if 'class' in str(data):
        print(name)

【讨论】:

    【解决方案2】:

    我刚刚想到的一个解决方案是创建自己的函数,从 .models 导入并注册元素,例如

    def import_and_register(arg_list):
        for a in arg_list:
            from .models import a
            admin.site.register(a)
    

    但是我可以使用内置功能来做到这一点吗?这种方法有什么主要缺点吗?

    【讨论】:

    • 一个潜在的缺点是未来程序员的认知开销。这是一个简单的功能,所以我不会称其为“主要骗局”,但如果“每个人”都按照您在原始问题中展示的方式进行操作,那么最好不要管它。
    【解决方案3】:

    我不相信有,但也许为了避免打字记住这些名称,只需将它们存储在一个集合中。

    from .models import Food, Drink, Topping
    
    MY_FANCY_MODELS = Food, Drink, Topping
    
    for m in MY_FANCY_MODELS:
        admin.site.register(m)
    
    

    【讨论】:

    • 这比我目前的方法打字更多:)
    • 对不起@ninazzo 我以为你想一遍又一遍地输入。我还特意使用了长变量名。
    【解决方案4】:

    我觉得,你可以这样——

    import models
    for i in dir(models):
        if isinstance(i, type):
            admin.site.register(i)
    

    dir(models) 检索模块的所有属性。

    【讨论】:

    • 但是如果模型中有我不想注册的东西怎么办?
    • 是的,这就是这种方法的缺点。我根据您在问题中提出的要求 list_of_things_imported_from[".models"] 建议了这种方法。
    猜你喜欢
    • 2018-01-09
    • 2018-03-31
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多