首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 2:函数别名或宏

Python 2:函数别名或宏
EN

Stack Overflow用户
提问于 2017-07-29 02:55:37
回答 2查看 631关注 0票数 2

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

例如:我正在尝试使用logging模块,并为函数logging.debuglogging.infologging.error等创建别名/宏。如果我在想要记录日志的地方使用这些函数,一切都会正常工作。但是如果我尝试像这样创建一个'alias‘函数包装器:

代码语言:javascript
复制
def debugLog(message):
    logging.debug(message)

..。那么行号报告就不再像预期的那样工作,报告的行总是声明包装器的位置,而不是实际的日志,这是没有任何实际用途的。

我确实找到了这个解决方案:

代码语言:javascript
复制
import logging
from logging import info as infoLog
from logging import debug as debugLog
from logging import error as errorLog
....

..。但它不适合我,因为我还创建了自己的日志严重程度:

代码语言:javascript
复制
logging.addLevelName(60, "NORMAL")

..。如果可能的话,我还想为它创建一个别名/宏,比如normalLog(message)=logging.log(60, message)?我在Python Docs或在线上找不到任何全面的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-29 03:00:32

您可以使用functools.partial

代码语言:javascript
复制
import functools
import logging
normalLog = functools.partial(logging.log, 60)

它工作得很好:

代码语言:javascript
复制
normalLog("Hey!!")
Level 60:root:Hey!!

partial将参数绑定到函数调用并返回一个部分对象(保存必要信息的可调用对象),因此您也可以在addLevelName方法中使用它:

代码语言:javascript
复制
activateLevel = functools.partial(logging.addLevelName, 60, "NORMAL")
activateLevel()

这里您有一个live working example,请注意日志行已正确报告。

票数 2
EN

Stack Overflow用户

发布于 2017-07-29 03:06:22

您可以使用frame对象来获取行号。获取frame对象的方法有很多,在下面的例子中我使用了sys._getframe(),参数1给出了前一个栈帧。并不保证在所有的sys._getframe()非C实现中都存在。其他几个函数返回frame对象,包括inspect模块。

代码语言:javascript
复制
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")

提供:

代码语言:javascript
复制
42
10 : A
43
13 : B
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45380540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档