Python 2:函数别名或宏

Python 2:函数别名或宏,python,macros,Python,Macros,我想知道是否有办法在Python2.7中为函数创建宏或别名 示例:我正在尝试使用日志记录模块,并为函数日志记录.调试,日志记录.信息,日志记录.错误,等等创建别名/宏。如果我使用这些函数,因为它们位于我想要日志的位置,一切正常。但如果我尝试创建一个“别名”函数包装器,如下所示: def debugLog(message): logging.debug(message) 。。。然后,行号报告不再按预期工作,报告的行号总是说明包装器的位置,而不是实际日志,这没有任何实际用途 我确实找到了这

我想知道是否有办法在Python2.7中为函数创建宏或别名

示例:我正在尝试使用
日志记录
模块,并为函数
日志记录.调试
日志记录.信息
日志记录.错误
,等等创建别名/宏。如果我使用这些函数,因为它们位于我想要日志的位置,一切正常。但如果我尝试创建一个“别名”函数包装器,如下所示:

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)
?我在中或网上找不到任何全面的信息。

您可以使用:

它工作得很好:

normalLog("Hey!!")
Level 60:root:Hey!!
partial
将参数绑定到函数调用并返回一个partial对象(一个包含必要信息的可调用对象),因此您也可以在
addLevelName
方法中使用它:

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

注意,日志行已正确报告。

您可以使用帧对象获取行号。可以通过多种方式获取帧对象,在下面的示例中,我使用了
sys.\u getframe()
,参数1给出了上一个堆栈帧
sys.\u 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

这不是一个函数吗?def normalLog(message):logging.log(60,message)如果您只写
normalLog=lambda m:logging.log(60,m)
?@OferSadan:这将显示相同的问题。对于推荐的模式,我建议查看。
inspect.currentframe
可能比
sys稍好一些。_getframe
@mgilson检查一下这个实例,它正常工作。啊。。。但是试着在
pypy
中运行它。如果你这样做了,你会有一点惊喜。注意,您依赖的是
functools.partial
的实现细节。这恰好在CPython上起作用,因为C函数在CPython上没有Python级别的堆栈项。
42
10 : A
43
13 : B