我想知道是否有办法在Python 2.7中为函数创建宏或别名。
示例:我正在尝试使用logging
模块并为函数logging.debug
,logging.info
,logging.error
等创建别名/宏。如果我将这些函数用作他们在我想要日志的地方,一切正常。但是,如果我尝试创建一个别名'像这样的函数包装器:
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 :(得分:2)
您可以使用functools.partial
:
import functools
import logging
normalLog = functools.partial(logging.log, 60)
效果很好:
normalLog("Hey!!")
Level 60:root:Hey!!
partial
将参数绑定到函数调用并返回一个部分对象(一个包含必要信息的可调用对象),因此您也可以在addLevelName
方法中使用它:
activateLevel = functools.partial(logging.addLevelName, 60, "NORMAL")
activateLevel()
这里有一个live working example,请注意日志行已正确报告。
答案 1 :(得分:-1)
您可以使用框架对象来获取行号。您可以通过多种方式获取帧对象,在下面的示例中,我使用sys._getframe()
,参数1给出了前一个堆栈帧。并不保证所有Python非C实现都存在sys._getframe()
。其他几个函数返回框架对象,包括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