2017-07-28 11 views
2

Python 2.7で関数のマクロまたはエイリアスを作成する方法があるのだろうかと思います。Python 2:関数エイリアスまたはマクロ

例:私はなど、logging.errorlogging.infologgingモジュールを使用し、機能logging.debugのエイリアス/マクロを作成しようとしている彼らは、私がログを望む場所にいるように私は、これらの機能を使用すると、すべてが正常に動作します。私はこのような「エイリアス」関数のラッパーを作成しようとした場合でも:その後、もはや報告した行番号が意図したとおりに動作します...

def debugLog(message): 
    logging.debug(message) 

を、行は常にラッパーの場所と実際ではないと述べて報告しましたログ、実際の使用ではありません。

私はこの解決策を見つけた:

import logging 
from logging import info as infoLog 
from logging import debug as debugLog 
from logging import error as errorLog 
.... 

...しかし、私はまた私自身のロギング重大度を作成するので、それは私には適していません。

logging.addLevelName(60, "NORMAL") 

を...と私は思います可能であれば、normalLog(message)=logging.log(60, message)のようなエイリアス/マクロを作成したいのですが? Python Docsまたはオンラインで何か包括的なものを見つけることができませんでした。

+0

はその機能はありませんか?def normalLog(message): logging.log(60、message) –

+0

'normalLog = lambda m:logging.log(60、m)'と書いたらどうでしょうか? –

+0

@OferSadan:同じ問題が発生します。 –

答えて

2

あなたはfunctools.partialを使用することができます。

import functools 
import logging 
normalLog = functools.partial(logging.log, 60) 

それはかなりうまく機能:

normalLog("Hey!!") 
Level 60:root:Hey!! 

partialは、通話機能や部分オブジェクト(necesary情報を保持している呼び出し可能オブジェクト)を返すように引数を結合し、したがって、addLevelNameメソッドでも使用できます。

activateLevel = functools.partial(logging.addLevelName, 60, "NORMAL") 
activateLevel() 

ここにはlive working exampleがあり、ログ行が正しく報告されていることに注意してください。

+0

これは行番号の報告権を得ていますか? – mgilson

+0

@mgilsonライブサンプルをチェックすると、正常に動作します。 – Netwave

+0

魅力的な作品です。正しいとマークされています。 –

-1

フレームオブジェクトを使用して行番号を取得できます。以下の例では、sys._getframe()を使用し、パラメータ1は前のスタックフレームを示しています。 sys._getframe()は、すべてのPython非C実装に存在するとは限りません。その他の関数のいくつかは、inspectモジュールを含むフレームオブジェクトを返します。

import sys 

def debugLog(message): 
    line = sys._getframe(1).f_lineno 
    print line, ':', message 


x = 42 
print x 
debugLog("A") 
y = x + 1 
print y 
debugLog("B") 

は与える:

42 
10 : A 
43 
13 : B 
+0

'inspect.currentframe'は' sys._getframe'よりやや良いかもしれません – mgilson

関連する問題