2010-12-03 15 views

答えて

3

私はかつてコマンドラインスクリプトファイルのデコレータを持っていました。

デコレータは次のように使用された:

@command 
def someFunc(): 
    # code goes here 

デコレータは、このような何かやっていた:

commands = {} 
def command(func) 
    commands[func.__name__] = func 
    return func 

をそして私はこのような何か行うことができます:

commandName = raw_input() 
commands[commandName](); 

以前にデコレータでラベルが付けられていた場合は、コンソールからコマンド名を読み込み、それを呼び出すことになりますinputのように危険な呼び出しが可能です)。

(私のコードでは名前は、コマンドライン引数、ないraw_inputから取られました。)

これは、簡単に、私は自分の名前を介してアクセスするコマンドを提供してみましょう。これは用途の1つです。一般的なルールは"関数定義の概念に独自のセマンティクスを追加する場合に便利です"。一般的なデコレータにも同じことが言えます。

(ところで、私の知る限り、__で始まる識別子はPythonで民間ことになっているので、func.__name__を使用するより正確であるfunc.func_nameフィールド、あります - ちょうどマイナーなディテールが)

+0

偉大な、私はまだfunc.func_nameのチップのおかげで言ったことを完全に理解する必要があります。 –

+1

関数には '__name__'があることに注意してください。あなたが最初に見つけた '__name__'はモジュールにあり、その名前はインポートされたものであるか、または初期の呼び出されたモジュールのための' '__main __ ''です。いずれの場合でも、 'sys.modules [__ name __]'は現在のモジュールです。 –

1

それは非常に便利ですデバッグ時。フレームワーク(またはその他の非常に汎用的なソフトウェア)を書くときは、の名前を使って簡単にデバッグして、何が流れているのかを知ることができます。

関連する問題