2012-07-09 96 views
2

如何在Python中检查给定的对象是否是模块?Python:我如何检查对象是否是模块?

这里是我的尝试:

>>> import sys 
>>> sys.modules["sys"].__class__ 
<class 'module'> 
>>> isinstance(sys.modules["sys"], module) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'module' is not defined 
>>> sys.modules["sys"].__class__.__module__ 
'builtins' 
>>> import builtins 
>>> builtins.module 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'module' 
+5

我讨厌成为那个家伙,但为什么你需要知道这个?如果你问自己“这个任意对象是一个模块吗?”,它会为我提出一些红旗,说你可能在错误的路上走得太远。 – 2012-07-09 21:38:34

+0

我只是想知道自己,我不想在任何项目中使用它。首先,我想到使用'isinstance',但似乎没有模块的类。 – 2012-07-09 21:42:29

+1

理解事物如何运作永不会感到痛苦 - 只是不要将它用于邪恶。 – 2012-07-09 21:46:08

回答

7
>>> import sys, types 
>>> isinstance(sys, types.ModuleType) 
True 

types模块还提供了许多其他类型的:

>>> dir(types) 
['BooleanType', 'BufferType', 'BuiltinFunctionType', 'BuiltinMethodType', 'ClassType', 'CodeType', 'ComplexType', 'DictProxyType', 'DictType', 'DictionaryType', 'EllipsisType', 'FileType', 'FloatType', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'InstanceType', 'IntType', 'LambdaType', 'ListType', 'LongType', 'MemberDescriptorType', 'MethodType', 'ModuleType', 'NoneType', 'NotImplementedType', 'ObjectType', 'SliceType', 'StringType', 'StringTypes', 'TracebackType', 'TupleType', 'TypeType', 'UnboundMethodType', 'UnicodeType', 'XRangeType', '__builtins__', '__doc__', '__file__', '__name__', '__package__'] 
>>> 
-2

if type(obj) == type(__builtin__)应该帮助

+2

不需要。首先,'isinstance'是检查类型的正确方法(如果证明有必要);其次,并非所有模块都是内置的。 – Marcin 2012-07-09 21:30:49

+0

谢谢。 SO在'builtin'的两侧都吃了双下划线 – darkphoenix 2012-07-09 21:32:19

+2

@darkphoenix:用左撇号包装你的代码。但'__builtin__'不存在,是吗? [我的意思是不是'__builtins__',带有s?] – DSM 2012-07-09 21:33:25

5

inspect.ismodule是相当多的最简单的你可以得到。

import inspect 
inspect.ismodule(inspect) 
+0

+1:简单地返回isinstance(object,types.ModuleType)的代码。 – DSM 2012-07-09 21:39:18