別名のつけかたあれこれ
こんにちわ、訓練されたpythonistaことmopemopeです。
http://d.hatena.ne.jp/kwatch/20090714/1247572629
を読んで。
んーまあそういう仕組みが全くないというわけではないかなあ。
別名の話をちょっと書いてみたいと思います。
__builtins__について
なんか__builtins__に突っ込むようなコードをたまに見ますが、大概グローバルスコープで十分です。
__builtins__は副作用でちゃうかも知れないのであんましいじらない方がいいと思います。
またグローバルスコープでscriptの冒頭で明示的に別名を書いておいた方がわかりやすいでしょう。
(どっかで勝手に別名に変えられてるとメンテしにくい)
asを使う
使いたい変数名とimportするモジュールの関数、クラス名などがぶつかる事はよくある話です。
その場合にはasを使います。
from time import time as _time
名前がぶつかるのを回避する他にもクソ長い名前を短縮化するためにも使われたりします。
typesを使う
builtin typeの話はよくある話だったりします。
builtinの型はtypesモジュールにも定義されています。
なので
from types import *
としておけばdictとか変数名に使われてもOKです。
まあそこでさらに短くしたい人はasなどでさらに別名をつけるといいでしょう。
from types import DictType as Dict
その他
pythonはスコープがぬるいので変数名がぶつかりがちです。
なので処理の冒頭などで別名、略語を使ったりする事はあります。
import bisect
insert = bisect.insort
別名もなるべくなら関数内などスコープを狭くした方がいいと思います。
また置き換えもよくやります。
その際には置き換え前にオリジナルをとっておくべきでしょう。
from socket import socket # socket.socket _socket = socket socket = XXXSocket
あらびきな方法
builtinsはPython/bltinmodule.cに書かれています。
SETBUILTIN("None", Py_None); SETBUILTIN("Ellipsis", Py_Ellipsis); SETBUILTIN("NotImplemented", Py_NotImplemented); SETBUILTIN("False", Py_False); SETBUILTIN("True", Py_True); SETBUILTIN("basestring", &PyBaseString_Type); SETBUILTIN("bool", &PyBool_Type); SETBUILTIN("memoryview", &PyMemoryView_Type); SETBUILTIN("bytearray", &PyByteArray_Type); SETBUILTIN("bytes", &PyString_Type); SETBUILTIN("buffer", &PyBuffer_Type); SETBUILTIN("classmethod", &PyClassMethod_Type); #ifndef WITHOUT_COMPLEX SETBUILTIN("complex", &PyComplex_Type); #endif SETBUILTIN("dict", &PyDict_Type); SETBUILTIN("enumerate", &PyEnum_Type); SETBUILTIN("file", &PyFile_Type); SETBUILTIN("float", &PyFloat_Type); SETBUILTIN("frozenset", &PyFrozenSet_Type); SETBUILTIN("property", &PyProperty_Type); SETBUILTIN("int", &PyInt_Type); SETBUILTIN("list", &PyList_Type); SETBUILTIN("long", &PyLong_Type); SETBUILTIN("object", &PyBaseObject_Type); SETBUILTIN("reversed", &PyReversed_Type); SETBUILTIN("set", &PySet_Type); SETBUILTIN("slice", &PySlice_Type); SETBUILTIN("staticmethod", &PyStaticMethod_Type); SETBUILTIN("str", &PyString_Type); SETBUILTIN("super", &PySuper_Type); SETBUILTIN("tuple", &PyTuple_Type); SETBUILTIN("type", &PyType_Type); SETBUILTIN("xrange", &PyRange_Type); #ifdef Py_USING_UNICODE SETBUILTIN("unicode", &PyUnicode_Type); #endif
あとはわかるな?