サーチ…


前書き

__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__)

つまり、モジュールの完全修飾名がログに表示され、メッセージがどこから来たのかがわかりやすくなります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow