Python Language
__name__特殊変数
サーチ…
前書き
__name__
特殊変数は、ファイルがモジュールとしてインポートされたかどうかをチェックし、 __name__
属性で関数、クラス、モジュールオブジェクトを識別するために使用されます。
備考
Pythonの特殊変数__name__
は、そのモジュールを含む名前が設定されています。トップレベル(インタラクティブなインタプリタやメインファイルなど)では、 '__main__'
設定されています。これは、モジュールがインポートされるのではなく直接実行されている場合に、文のブロックを実行するために使用できます。
関連する特別な属性obj.__name__
は、クラス、インポートされたモジュール、関数(メソッドを含む)で見つけられ、定義されたときにオブジェクトの名前を与えます。
__name__ == '__main__'
特別な変数__name__
はユーザによって設定されていません。主に、モジュールが実行されているかどうか、またはimport
が実行されたために実行されているかどうかをチェックするために使用されます。モジュールがインポートされるときにコードの特定の部分を実行しif __name__ == '__main__'
にするにはif __name__ == '__main__'
かif __name__ == '__main__'
確認します。
module_1.pyを 1行にする:
import module2.py
そして、何が起こるのかを、 module2.pyに応じて見てみましょう
状況1
module2.py
print('hello')
module1.pyを実行するとhello
表示されます
module2.pyを実行するとhello
表示されます
状況2
module2.py
if __name__ == '__main__':
print('hello')
module1.pyを実行すると何も印刷されません
module2.pyを実行するとhello
表示されます
function_class_or_module .__ name__
関数、クラスまたはモジュールの特殊な属性__name__
は、その名前を含む文字列です。
import os
class C:
pass
def f(x):
x += 2
return x
print(f)
# <function f at 0x029976B0>
print(f.__name__)
# f
print(C)
# <class '__main__.C'>
print(C.__name__)
# C
print(os)
# <module 'os' from '/spam/eggs/'>
print(os.__name__)
# os
ただし、 __name__
属性は、クラス、メソッド、または関数を参照する変数の名前ではなく、定義時に与えられた名前です。
def f():
pass
print(f.__name__)
# f - as expected
g = f
print(g.__name__)
# f - even though the variable is named g, the function is still named f
これは、とりわけ、デバッグのために使用することができます:
def enter_exit_info(func):
def wrapper(*arg, **kw):
print '-- entering', func.__name__
res = func(*arg, **kw)
print '-- exiting', func.__name__
return res
return wrapper
@enter_exit_info
def f(x):
print 'In:', x
res = x + 2
print 'Out:', res
return res
a = f(2)
# Outputs:
# -- entering f
# In: 2
# Out: 4
# -- exiting f
ロギングでの使用
組み込みlogging
機能を設定する際の共通のパターンは、現在のモジュールの__name__
でロガーを作成すること__name__
。
logger = logging.getLogger(__name__)
つまり、モジュールの完全修飾名がログに表示され、メッセージがどこから来たのかがわかりやすくなります。