开发者

How do I get list of all Python types (programmatically)?

开发者 https://www.devze.com 2023-01-06 01:50 出处:网络
A discussion in a recent question, that min/max() need objects to be comparable, made me wonder how do I find which Python types support particular method (__cmp__, or maybe __lt开发者_JAVA百科__ - sp

A discussion in a recent question, that min/max() need objects to be comparable, made me wonder how do I find which Python types support particular method (__cmp__, or maybe __lt开发者_JAVA百科__ - specifics not important).

Pivotal to that seems to be ability to get list of all types, to start with. Then i can simply check hasattr(thisType, '__cmp__'). So how do i enumerate all data types there are?


>>> try: import __builtin__ as b
... except ImportError: import builtins as b
...
>>> builtin_types= [t
...  for t in b.__dict__.values()
...  if isinstance(t, type)]
>>> import pprint
>>> pprint.pprint(sorted(builtin_types, key=repr))
[<type 'basestring'>,
 <type 'bool'>,
 <type 'buffer'>,
 <type 'bytearray'>,
 <type 'classmethod'>,
 <type 'complex'>,
 <type 'dict'>,
 <type 'enumerate'>,
 <type 'exceptions.ArithmeticError'>,
 <type 'exceptions.AssertionError'>,
 <type 'exceptions.AttributeError'>,
 <type 'exceptions.BaseException'>,
 <type 'exceptions.BufferError'>,
 <type 'exceptions.BytesWarning'>,
 <type 'exceptions.DeprecationWarning'>,
 <type 'exceptions.EOFError'>,
 <type 'exceptions.EnvironmentError'>,
 <type 'exceptions.Exception'>,
 <type 'exceptions.FloatingPointError'>,
 <type 'exceptions.FutureWarning'>,
 <type 'exceptions.GeneratorExit'>,
 <type 'exceptions.IOError'>,
 <type 'exceptions.ImportError'>,
 <type 'exceptions.ImportWarning'>,
 <type 'exceptions.IndentationError'>,
 <type 'exceptions.IndexError'>,
 <type 'exceptions.KeyError'>,
 <type 'exceptions.KeyboardInterrupt'>,
 <type 'exceptions.LookupError'>,
 <type 'exceptions.MemoryError'>,
 <type 'exceptions.NameError'>,
 <type 'exceptions.NotImplementedError'>,
 <type 'exceptions.OSError'>,
 <type 'exceptions.OverflowError'>,
 <type 'exceptions.PendingDeprecationWarning'>,
 <type 'exceptions.ReferenceError'>,
 <type 'exceptions.RuntimeError'>,
 <type 'exceptions.RuntimeWarning'>,
 <type 'exceptions.StandardError'>,
 <type 'exceptions.StopIteration'>,
 <type 'exceptions.SyntaxError'>,
 <type 'exceptions.SyntaxWarning'>,
 <type 'exceptions.SystemError'>,
 <type 'exceptions.SystemExit'>,
 <type 'exceptions.TabError'>,
 <type 'exceptions.TypeError'>,
 <type 'exceptions.UnboundLocalError'>,
 <type 'exceptions.UnicodeDecodeError'>,
 <type 'exceptions.UnicodeEncodeError'>,
 <type 'exceptions.UnicodeError'>,
 <type 'exceptions.UnicodeTranslateError'>,
 <type 'exceptions.UnicodeWarning'>,
 <type 'exceptions.UserWarning'>,
 <type 'exceptions.ValueError'>,
 <type 'exceptions.Warning'>,
 <type 'exceptions.ZeroDivisionError'>,
 <type 'file'>,
 <type 'float'>,
 <type 'frozenset'>,
 <type 'int'>,
 <type 'list'>,
 <type 'long'>,
 <type 'object'>,
 <type 'property'>,
 <type 'reversed'>,
 <type 'set'>,
 <type 'slice'>,
 <type 'staticmethod'>,
 <type 'str'>,
 <type 'str'>,
 <type 'super'>,
 <type 'tuple'>,
 <type 'type'>,
 <type 'unicode'>,
 <type 'xrange'>]


@tzot answers won't work with python 3.x because __builtin__ module has changed of name and structure. You should now use builtin module.

try :
    import __builtin__
except: 
    # Python 3.x
    import builtins

try : 
    builtin_types = [t for t in __builtin__.__dict__.itervalues() if isinstance(t, type)]
except:
    builtin_types = [getattr(builtins, d) for d in dir(builtins) if isinstance(getattr(builtins, d), type)]

Now with Python 3.x :

>>> from pprint import pprint 
>>> pprint(builtin_types)
[<class 'ArithmeticError'>,
 <class 'AssertionError'>,
 <class 'AttributeError'>,
 <class 'BaseException'>,
 <class 'BlockingIOError'>,
 <class 'BrokenPipeError'>,
 <class 'BufferError'>,
 <class 'BytesWarning'>,
 <class 'ChildProcessError'>,
 <class 'ConnectionAbortedError'>,
 <class 'ConnectionError'>,
 <class 'ConnectionRefusedError'>,
 <class 'ConnectionResetError'>,
 <class 'DeprecationWarning'>,
 <class 'EOFError'>,
 <class 'OSError'>,
 <class 'Exception'>,
 <class 'FileExistsError'>,
 <class 'FileNotFoundError'>,
 <class 'FloatingPointError'>,
 <class 'FutureWarning'>,
 <class 'GeneratorExit'>,
 <class 'OSError'>,
 <class 'ImportError'>,
 <class 'ImportWarning'>,
 <class 'IndentationError'>,
 <class 'IndexError'>,
 <class 'InterruptedError'>,
 <class 'IsADirectoryError'>,
 <class 'KeyError'>,
 <class 'KeyboardInterrupt'>,
 <class 'LookupError'>,
 <class 'MemoryError'>,
 <class 'NameError'>,
 <class 'NotADirectoryError'>,
 <class 'NotImplementedError'>,
 <class 'OSError'>,
 <class 'OverflowError'>,
 <class 'PendingDeprecationWarning'>,
 <class 'PermissionError'>,
 <class 'ProcessLookupError'>,
 <class 'RecursionError'>,
 <class 'ReferenceError'>,
 <class 'ResourceWarning'>,
 <class 'RuntimeError'>,
 <class 'RuntimeWarning'>,
 <class 'StopAsyncIteration'>,
 <class 'StopIteration'>,
 <class 'SyntaxError'>,
 <class 'SyntaxWarning'>,
 <class 'SystemError'>,
 <class 'SystemExit'>,
 <class 'TabError'>,
 <class 'TimeoutError'>,
 <class 'TypeError'>,
 <class 'UnboundLocalError'>,
 <class 'UnicodeDecodeError'>,
 <class 'UnicodeEncodeError'>,
 <class 'UnicodeError'>,
 <class 'UnicodeTranslateError'>,
 <class 'UnicodeWarning'>,
 <class 'UserWarning'>,
 <class 'ValueError'>,
 <class 'Warning'>,
 <class 'OSError'>,
 <class 'ZeroDivisionError'>,
 <class '_frozen_importlib.BuiltinImporter'>,
 <class 'bool'>,
 <class 'bytearray'>,
 <class 'bytes'>,
 <class 'classmethod'>,
 <class 'complex'>,
 <class 'dict'>,
 <class 'enumerate'>,
 <class 'filter'>,
 <class 'float'>,
 <class 'frozenset'>,
 <class 'int'>,
 <class 'list'>,
 <class 'map'>,
 <class 'memoryview'>,
 <class 'object'>,
 <class 'property'>,
 <class 'range'>,
 <class 'reversed'>,
 <class 'set'>,
 <class 'slice'>,
 <class 'staticmethod'>,
 <class 'str'>,
 <class 'super'>,
 <class 'tuple'>,
 <class 'type'>,
 <class 'zip'>]

And you can do :

>>> a = "foo"
>>> type(a) in builtin_types 
True


Presence of the relational special methods isn't enough to guarantee comparability; the methods can still raise an exception if they don't like the specific type(s) passed to them.

0

精彩评论

暂无评论...
验证码 换一张
取 消