2012-07-09 70 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