【问题标题】:Check if a parameter is a Python module?检查参数是否是 Python 模块?
【发布时间】:2010-12-05 13:41:24
【问题描述】:

我如何(以 Python 方式)检查参数是否是 Python 模块?没有像模块或包这样的类型。

>>> os
<module 'os' from '/usr/lib/python2.6/os.pyc'>

>>> isinstance(os, module)
Traceback (most recent call last):
  File "/usr/lib/gedit-2/plugins/pythonconsole/console.py", line 290, in __run
    r = eval(command, self.namespace, self.namespace)
  File "<string>", line 1, in <module>
NameError: name 'module' is not defined

我可以这样做:

>>> type(os)
<type 'module'>    

但是我将它与什么进行比较? :(

我制作了一个简单的模块来快速查找模块中的方法并获取它们的帮助文本。我为我的方法提供了一个模块 var 和一个字符串:

def gethelp(module, sstring):

    # here i need to check if module is a module.

    for func in listseek(dir(module), sstring):
        help(module.__dict__[func])

当然,即使 module = 'abc': 然后 dir('abc') 也会给我字符串对象的方法列表,但我不需要它。

【问题讨论】:

  • 你知道 help() 方法和 pydoc 以及类似的努力,对吧?
  • pydoc 有点不同。我需要一种简单的方法来查找方法,而无需知道它的确切名称。例如,在 os.path 中有“大小”的东西。
  • 你不能输入一个模块吗?你需要它做什么?只要尝试一下,如果失败就捕获异常。
  • 嗯,文档和帮助是一种自省,所以在这种情况下似乎没问题。

标签: python types


【解决方案1】:

这看起来有点老套,但是:

>>> import sys
>>> import os
>>> type(os) is type(sys)
True

【讨论】:

  • 呵呵,在标准库中,模块types,发现这个:ModuleType = type(sys) :)
【解决方案2】:
from types import ModuleType

isinstance(obj, ModuleType)

【讨论】:

  • 为什么这是被接受的答案? package 也是 ModuleType 的一个实例
  • @Wang 我不相信 Python 中的“包”和“模块”之间有任何区别。它们都是模块。
【解决方案3】:
>>> import inspect, os
>>> inspect.ismodule(os)
True

【讨论】:

  • 如果您出于某种原因从globals().values() 测试字典以查找/删除模块ismodule() 不起作用必须使用isclass()...
  • @nimig18: 查找globals()中的所有模块:[k for k in globals().keys() if ismodule(eval(k))]
【解决方案4】:

@Greg Hewgill@Lennart Regebro 的混合答案:

>>> from types import ModuleType
>>> import os
>>> type(os) is ModuleType
True

【讨论】:

    【解决方案5】:

    将模块扁平化为字符串,并检查它是否以'&lt;module '开头

    import matplotlib
    foobarbaz = "some string"
    print(str(matplotlib).startswith("<module "))     #prints True
    print(str(foobarbaz).startswith("<module "))      #prints False
    

    缺点是这可能会与以文本 '&lt;module' 开头的 python 字符串发生冲突。您可以尝试使用正则表达式对其进行更强的分类。

    【讨论】:

      【解决方案6】:

      两种方式,你不能导入任何模块:

      • type(os) is type(__builtins__)
      • str(type(os)).find('module')&gt;-1

      【讨论】:

      • 在 3.7.1 中 print(type(__builtins__))&lt;class 'dict'&gt; 而不是 &lt;class 'module'&gt;
      猜你喜欢
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2020-11-21
      • 2019-09-23
      • 2018-08-06
      • 1970-01-01
      • 2015-11-12
      相关资源
      最近更新 更多