Hatena::Grouppython

Pythonの覚書

2013-04-09

組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい><

| 13:50 | 組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい>< - Pythonの覚書 を含むブックマーク はてなブックマーク - 組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい>< - Pythonの覚書 組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい>< - Pythonの覚書 のブックマークコメント

__builtins__っていうモジュールが組み込みデータ型や組込み関数を持っているということはわかった。

dir()で調べてみる。

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']

この中から、組込み関数だけ抽出したいのだが上手く行かない。

id:Alice1017さんにご教授いただき、組込み関数だけ取得できました。

たぶん、漏れはないはず。

サンプルコード

>>> for attr in dir(__builtin__):
    f = getattr(__builtin__,attr)
    if isinstance(f,types.BuiltinFunctionType):
        print attr
...         
__import__
abs
all
any
apply
bin
callable
chr
cmp
coerce
compile
delattr
dir
divmod
eval
execfile
filter
format
getattr
globals
hasattr
hash
hex
id
input
intern
isinstance
issubclass
iter
len
locals
map
max
min
next
oct
open
ord
pow
print
range
raw_input
reduce
reload
repr
round
setattr
sorted
sum
unichr
vars
zip

~以下、更新前~

命名規則による分類

大文字で始まっている定義は、文字列。

小文字ではじまっているのが、関数なのではないか?と短絡的に考えていたのだけれども、strなど、データ型の名前も小文字ではじまっているではないか・・・。ってことで、命名規則では分類出来ない。

isinstanceで型チェック

type()や、isinstance(obj,typeinfo)でチェックするのが王道だなと思い、以下を試す。

>>> import types
>>> for attr in dir(__builtins__):
...     if isinstance(attr,types.BuiltinFunctionType):
...             print attr
... 

見事に空振り。なぜなら、dir()が返却するのは、名前つまりstrなんです・・・。

>>> type(sum)
<type 'builtin_function_or_method'>

↑のようにfunctionの型を返却してくれると期待していただけにショック。

callableでチェック

>>> for attr in dir(__builtin__):
...     if callable(attr):
...         print attr
...  

これも見事に空振り。

これも理由は同じで、dir()が返却するのは、名前つまりstrだから。

ついでに、関数以外でもcallableがTrueを返却するんで、関数だけ抽出出来ないし・・・。

evalを使う

dir()が文字列で返却すると、こうなったらeval使うしかないなと思い以下を試す。

>>> for attr in dir(__builtin__):
    if eval('isinstance('+attr+',types.BuiltinFunctionType)'):
        print attr,
...         
__import__ abs all any apply bin callable chr cmp coerce compile delattr dir divmod eval execfile filter format getattr globals hasattr hash hex id input intern isinstance issubclass iter len locals map max min next oct open ord pow  File "<string>", line 1
    isinstance(print,types.BuiltinFunctionType)
                   ^
SyntaxError: invalid syntax

printのところで怒られる。。。どうしようか。。。

Alice1017Alice10172013/04/10 17:46初めまして。コメント失礼します。

for attr in dir(__builtins__):
... if isinstance(attr,types.BuiltinFunctionType):
... print attr

この処理で、isinstanceの前に getattr(__builtins__, attr)で関数そのものを取得すればいいんじゃないかと思います
まだコンソールで試してないのですが、動くと思います。

for attr in dir(__builtins__):
... f = getattr(__builtins__, attr)
... if isinstance(f,types.BuiltinFunctionType):
... print attr

oneshotlife_tomoneshotlife_tom2013/04/11 20:40>Alice1017さん
コメントありがとうございます。
ご教授いただいた通りで期待通りの動作をしました。
勉強になりました。

xvwioxqsfqxvwioxqsfq2014/04/12 20:59wbtmvqzuipo, <a href="http://www.cabtgppukz.com/">ajnbtjwxfz</a> , [url=http://www.xcwogexcne.com/]ooupkwdktj[/url], http://www.blrwbwlcoy.com/ ajnbtjwxfz