Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

別名のつけかたあれこれ

こんにちわ、訓練された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

あとはわかるな?