【问题标题】:How do I import a module only when needed?如何仅在需要时导入模块?
【发布时间】:2012-12-27 09:12:10
【问题描述】:

我正在为 gupshup、nexmo、redrabitt 等服务提供商编写不同的 python 模块。

#gupshup.py
class Gupshup():
    def test():
        print 'gupshup test'

所有其他模块都有 test() 方法,其中包含不同的内容。我知道要调用谁的 test()。我想写另一个模块 provider,它看起来像 -

#provider.py
def test():
    #call test() from any of the providers

我将传递一些 sting 数据作为命令行参数,该参数将具有模块的名称。

但我不想用import providers.* 导入所有模块,然后调用providers.gupshup.test() 之类的方法。只要知道我将在运行时调用谁的 test(),当我想调用它的测试方法时,如何只加载 nexmo 模块?

【问题讨论】:

  • 该死的,你在做什么?您避免使用类的原因毫无意义,您所追求的似乎仍然是多态性(只是没有继承),但是您仍然使用继承和类,委托类没有理由存在,整个事情通常是混乱的.我可以建议您退后一步,描述一下您要解决的实际问题吗?
  • 我想将 Car、Bike、Truck 类放在单独的文件中。因此,当我需要添加车辆时,我会将文件添加到包含这些类的文件夹中。我知道我要调用谁的方法 - move()。汽车、自行车或卡车。但我不想导入所有类然后执行 Car.move()。
  • 嗯...我仍然不确定您的问题是什么,但是:(1)您可以在您想要的任何文件(模块)中放置任意数量的类。你可以在一个模块中有多个类,你可以让它们分布在不同的项目中,等等。(2) 你不需要为此导入 all 类。但是您至少需要具体类及其超类(显然;否则,您将如何继承任何东西?)。 (3)如果你不需要继承任何东西,那就不要继承。您不一定需要超类;使用鸭子打字!
  • 我应该删除这个问题,因为它看起来很混乱并写一个新的?
  • 您可以编辑它。虽然如果您花一些时间思考和重新阅读它可能会有所帮助。

标签: import python-2.7


【解决方案1】:

如果模块名是字符串,可以使用importlib根据需要导入你想要的模块:

from importlib import import_module

# e.g., test("gupshup")
def test(modulename):
    module = import_module(module_name)
    module.test()

import_module 接受一个可选的第二个参数,指定要从中导入模块的包。

如果你还需要从模块中获取一个类来获取测试方法,你可以通过getattr从模块中获取:

# e.g., test("gupshup", "Gupshup")
def test(modulename, classname):
    module = import_module(module_name)
    cls = getattr(module, classname)
    instance = cls()  # maybe pass arguments to the constructor
    instance.test()

【讨论】:

  • 太棒了。这会做。为 getattr 方法 +1。
  • 嘿。尝试使用带有包名的 import_module 作为第二个参数。它没有用。做了module = import_module(module_name, 'providers') 其中 providers 是一个包含模块 gupshup 的包。请注意,providers 包位于 provider.py 所在的同一文件夹中。
  • 嗨,当我输入print __package__ 时,它会显示None。请参考我之前的评论。我已将import_module 放入文件provider.py 中。而且我在与provider.py 相同的目录中有一个文件夹providers。这个 providers 文件夹是我的包,我把 _init_.py 放在里面。我有我的模块 gupshup.py、nexmo.py、redrabbit.py 等等。在这个包中,但不能导入它们。
  • 在有test功能的模块中,可以import gupshupimport providers.gupshup吗?
  • 是的。设置$PYTHONPATH 后,我可以在与模块相同的目录中执行import gupshupfrom providers import gupshup
猜你喜欢
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2019-11-10
  • 2021-04-08
  • 1970-01-01
相关资源
最近更新 更多