Python 2:函数别名或宏

时间:2017-07-28 18:55:37

标签: python macros

我想知道是否有办法在Python 2.7中为函数创建宏或别名。

示例:我正在尝试使用logging模块并为函数logging.debuglogging.infologging.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或在线找到任何内容。

2 个答案:

答案 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