2017-08-07 18 views
4

命令dir(__builtins__)只列出所有151个内建库。直接在python中检索68个内置函数?

len(dir(__builtins__)) # output 151 

然而,它列出2. Built-in Functions — Python 3.6.2 documentation

我试图从dir(__builtins__)得到用作下列步骤68的内置功能:

#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内置直接起作用?

+3

你真的不能。并非所有的内建“函数”都是“函数”等。另外,“dir(__ builtins __)”并不是有序的。 –

+1

@AnttiHaapala其实'dir()'按字母顺序排列列表。 – augurar

+0

是的,只有42个真正的内建函数。 @AnttiHaapala –

回答

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来自网站builtins;实际的文档是错误的,因为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 

同样多的异常类型始终可用,即使他们没有列出。

2

我想聪明这件事,但是部分失败,但仍然是一个有趣的发现,所以在这里它是:

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

这蟒蛇返回的42项的列表对我来说3.5.3

如果不使用types,一个很好的分隔符是检查是否在__builtins__启动的项目以小写字母,这通常表示该功能,所以

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

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

+0

经过测试,找到了一个有趣的理解:b = [我为in in dir(__ builtins__)if type(eval(i))== type(eval)] –

+0

@DFK有趣,这给出了和我第一个完全相同的结果例 –

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'> 
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) 

它产生相同的72项@ OferSadan的简单i[0].islower()滤波器产生!(+1)

附加有:copyrightcreditsexitlicensequit

缺失:__import__

如果您消除not x.startswith('__')测试,你回来__import__,但你也可以得到__build_class____loader__