2017-08-07 6 views
4

コマンドdir(__builtins__)は、151個の組み込みライブラリをすべて一覧表示するだけです。Pythonで68個の組み込み関数を直接取得できますか?

len(dir(__builtins__)) # output 151 

しかし、それは私が次のステップとしてdir(__builtins__)から機能を取得しようとしました2. Built-in Functions — Python 3.6.2 documentation

で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個の名前があります... openはモジュールioであり、helpはサイトのbuiltinsからのものであるため、ドキュメントのhelpopenが私のフィルタと一致しないためです。 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)] 

これはPythonで私のための42の項目3.5.3

のリストを返します。 typesを使用せずに、素敵な区切り文字がチェックする場合は、通常の関数を示し、小文字、と__builtins__スタートでのアイテムなので、

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

私のために72個のアイテムを返します。ドキュメントよりも完成しているのでしょうか?私の推測ははいでしょう。これらのアイデアをテストするためにあなた自身でチェックしてください。

+0

興味深い理解を見つける:b = [i dir(__ builtins__)の場合はtype(eval(i))== type(eval)] –

+0

@DFK面白い、それは私の最初のものと全く同じ結果を与える例 –

1

技術的には、Pythonではわずか42(3.4)程度の機能とメソッドしか組み込まれていません。 zipまたはintは、例えば、実際に機能していないことを

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

注:リストの残りの部分は組み込み変数とtypessです。彼らは同名の組み込みデータ型のコンストラクタです:

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) 

それは@ OferSadanのシンプルなi[0].islower()フィルタが生成する同じ72項目を生成します!(1)

追加は、以下のとおりです。あなたがnot x.startswith('__')テストを排除する場合は、あなたが戻って__import__を得る__import__

あなたも__build_class____loader__を得る:copyrightcreditsexitlicensequit

削除はされています

関連する問題