【问题标题】:How to programmatically do: " from lib import * " in python如何以编程方式执行:python 中的“from lib import *”
【发布时间】:2016-02-29 18:23:06
【问题描述】:

我在找方法

from myLib import *

在我的 python 代码中进行导入循环

__import__() 方法似乎没有提供* 功能,因为我必须指定要导入的每个内容。

有没有办法做到*

非常感谢您的帮助

编辑:

澄清一下,目标是导入一堆类,它们位于包中的一堆模块中,以通过类名直接访问它们,不像 myPacakge.myModule.myClass(),也不像 myModule.myClass( ) 但只是 myClass()

想象一下你有:

myScript.py
myPackage
    \__init__.py
    \myModule_0.py
    \myModule_1.py
    \myModule_2.py
    \myModule_3.py
    \myModule_4.py

每个 myModule 包含一堆类,并且您正在编辑 myScript.py,您希望能够访问每个 myModule_X.py 中的所有类,例如:

myClass()
myOtherClass()
myOtherOtherClass()

等等...不像 myModule_X.myClass() 也不像 myPackage.myModyle_X.myClass()

【问题讨论】:

  • 出于好奇,您为什么要这样做? 99% 的情况下,您通常在导入之前就知道要导入的内容,所以 from whatever import * 可以很好地解决这个问题。
  • 这个问题让我尖叫XY problem。您这样做是为了解决什么问题?
  • 我很困惑,你为什么不能只导入 myLib?这和 import json 然后做 json.loads(a_variable) 的想法是一样的
  • 我有一大堆文件,里面有很多类和方法,我想导入所有类和方法,并循环遍历所有这些文件。 from myLib_1 import *, from myLib_2 import *, from myLib_3 import *...etc
  • 我知道 package 和 '_ _ all _ _' 但它并没有像我有一个 _ _ init _ _.py 文件和 _ _ all _ _ 和我所有的里面的文件,从 myPackage 导入 * 只返回我所有的 _ _ 所有 _ _ 模块,而不是这些模块中的所有类或方法

标签: python import


【解决方案1】:

__import__ 返回导入模块的命名空间。如果您想从中执行import *,那么您可以遍历该名称空间并将所有模块的名称填充到模块的全局变量中,这就是from modulename import * 所做的。你可能不应该,就像你不应该使用import *(除了更多,因为你甚至不知道你正在导入什么模块)但是你可以。

module = __import__("modulename")
if hasattr(module, "__all__"):        # module tells us which names are all names
    globals().update((name, getattr(module, name)) for name in module.__all__)
else:                                 # import all non-private names
    globals().update((name, getattr(module, name)) for name in dir(module) 
                      if not name.startswith("_"))

你也可以这样写,这样更安全一些,因为它避免破坏任何已经定义的全局名称(冒着可能没有你需要的名称的风险):

module = __import__("modulename")
if hasattr(module, "__all__"):        # module tells us which names are all names
    globals().update((name, getattr(module, name)) for name in module.__all__
                      if name not in globals())
else:                                 # import all non-private names
    globals().update((name, getattr(module, name)) for name in dir(module) 
                      if not (name.startswith("_") or name in globals()))

【讨论】:

  • 我正在尝试这个,会告诉你它是否有效:)
  • @repié 非常确定你在做什么。这不仅会引起混乱,而且会导致导入拥挤,可能导致命名冲突,阅读起来非常困难。只是绝对没有更优雅的方法。
  • 对我不起作用:AttributeError: 'module' object has no attribute 'myModule'
  • @Obj3ctiv3_C_88 我希望找到更好的方法,目标是导入一堆位于包内的类,并直接通过名称而不是 module.class() 或包来调用它们。 module.class() 并自动导入它们,而不是从 xxx import * 复制/粘贴 *
  • AttributeError: 'module' object has no attribute 'myModule' 可能意味着您在 __all__ 中有一些实际上并未在模块中定义的内容。
【解决方案2】:
import myLib 

将导入所有内容,但我建议不要全部导入

要使用它,您需要在所有导入前加上

myLib.my_module

如果您只想即时导入某些内容,则需要进行条件导入,例如:

if condition_met:
    import myLib.my_module

【讨论】:

  • 我猜myLib 不是模块的实际名称,但实际上是绑定到包含模块名称的字符串的标识符。前任。他想做myLib = "math"; do_something(myLib); print sqrt(23)
  • 不确定,因为他问是否有办法导入*,将更新答案
  • 我尝试在代码中导入,我知道基本的导入内容和包,但我想以编程方式从 lib import *
  • 我不确定你的意思,以编程方式表示一次一个,但使用 * 导入相当于只导入 myLib,它也会导入所有内容。
  • 想象你有一个包,里面有很多包含很多类的文件,你将所有这些文件添加到 _ _ all _ _ 变量中,并且你只想访问这些直接从您的脚本中编写类,而无需编写 myPackage.myModule.myClass(),而不是事件 myModule.myClass(),而只是 myClass()
【解决方案3】:

import * 对静态代码检查和调试造成严重破坏,因此我不建议在脚本中使用它。假设您没有尝试对此做一些不明智的事情,您可以考虑使用 __all__ 属性来获取包成员的字符串列表。

import my_package
for sub_package in my_package.__all__:
    print "found " + sub_package

【讨论】:

  • 我就是这么说的,不知道他们要什么。也许是语言脱节?
猜你喜欢
  • 2017-09-06
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2015-03-14
  • 2020-02-11
  • 2021-12-25
  • 2017-10-03
相关资源
最近更新 更多