直接在python中检索68个内置函数?

时间:2017-08-07 05:12:42

标签: python

命令dir(__builtins__)只列出所有151个内置库。

len(dir(__builtins__)) # output 151

但是,它列出了2. Built-in Functions — Python 3.6.2 documentation

中的68个内置函数

我尝试从dir(__builtins__)获取函数,如下所示:

#I hardtyped the functions as comparition.
officical_builtin_functions = ['abs','all',....]
y = official_builtin_functions
len(y) #output:68
# get official builtin functions from python_builtin_library
dir(__builtins__).index('abs') #output:79
qualified_functions = python_builtin_library[79:]
qualified_functions.pop('exit')
qualified_functions.pop('credits')
qualified_functions.pop('copyright')
qualified_functions.pop('quit')
qualified_functions.pop('license')
quilified_functions.append('__import__')
# then get the 68 qualified_functions from dir(__builtins__)

如何直接列出68个内置函数?

4 个答案:

答案 0 :(得分:3)

Python 3.5中的一种方法是列出具有__module__属性且设置为builtins和小写名称的对象:

>>> sorted(k for k, v in vars(__builtins__).items()
           if k.islower() and getattr(v, '__module__', '') == 'builtins')
['__build_class__', '__import__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray',
 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'delattr', 'dict', 'dir', 
 'divmod', 'enumerate', 'eval', 'exec', 'filter', 'float', 'format', 'frozenset', 'getattr', 
 'globals', 'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
 'iter', 'len', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct',
 'ord', 'pow', 'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', 'setattr',
 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

请注意,__import__列在文档中,但__build_class__未列出。 Python 3.5上有67个名字。文档中的列表有68个名称...这也是因为文档中的helpopen与我的过滤器不匹配,因为open来自模块iohelp来自网站内置;实际上文档是错误的,因为help不需要可用:

% python3 -S
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
>>> help
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'help' is not defined

同样,许多异常类型始终可用,即使它们未在那里列出。

答案 1 :(得分:2)

我尝试过聪明但部分失败,但仍然是一个有趣的发现,所以这里是:

import types
b = [i for i in dir(__builtins__) if isinstance(eval(i), types.BuiltinFunctionType)]

这将在python 3.5.3中为我返回42个项目的列表

不使用types,一个好的分隔符是检查__builtins__中的项是否以小写字母开头,通常表示一个函数,所以

b = [i for i in dir(__builtins__) if i[0].islower()]

为我返回72项,或许它比文档更完整?我的猜测是肯定的。亲自检查以测试这些想法

答案 2 :(得分:1)

从技术上讲,Python中只有42个(在3.4中)内置函数和方法。列表的其余部分是内置变量和typess:

real_builtins = [e for e in dir(__builtins__) if isinstance(eval(e), type(vars))]
len(real_builtins)
# 42
real_builtins[:5] + real_builtins[-5:]
# ['__build_class__', '__import__', 'abs', 'all', 'any',
#  'round', 'setattr', 'sorted', 'sum', 'vars']
type(abs)
#<class 'builtin_function_or_method'>

请注意,zipint不是真正的功能。它们是同名内置数据类型的构造函数:

type(zip)
# <class 'type'>
type(int)
# <class 'int'>

答案 3 :(得分:1)

我试图通过功能过滤它(主要是)并提出:

from inspect import isclass

documented_builtins = [x
    for x in dir(__builtins__) if not x.startswith('__') and (
        lambda y: callable(y) and not(isclass(y) and issubclass(y,
            BaseException)))(eval(x))
]

print(documented_builtins)

它生成了与@ OferSadan的简单i[0].islower()过滤器相同的72个项目! (1)

增加的内容有:copyrightcreditsexitlicensequit

删除是:__import__

如果您取消not x.startswith('__')测试,则会返回__import__,但您还会获得__build_class____loader__