我正在尝试编写一个简单的装饰器,在调用装饰函数之前记录给定的语句.记录的语句应该看起来都来自同一个函数,我认为这是functools.wraps()的目的.
为什么以下代码:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(funcName)20s - %(message)s')
from functools import wraps
def log_and_call(statement):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
logging.info(statement)
return func(*args, **kwargs)
return wrapper
return decorator
@log_and_call("This should be logged by 'decorated_function'")
def decorated_function():
logging.info('I ran')
decorated_function()
Run Code Online (Sandbox Code Playgroud)
导致日志语句如:
wrapper - This should be logged by 'decorated_function'
decorated_function - I ran
Run Code Online (Sandbox Code Playgroud)
我认为对换行的调用会用wrapped_function的名称重命名包装器.
我正在使用python 2.7.1.
python的跟踪模块将允许您运行脚本打印每行代码,因为它在脚本和所有导入的模块中运行,如下所示:
python -m trace -trace myscript.py
Run Code Online (Sandbox Code Playgroud)
有没有办法做同样的事情,但只打印顶级调用,即只打印行中的行myscript.py?
我正在尝试调试中止陷阱失败,我无法弄清楚它在哪里死亡.不幸的是,使用完整--trace需要永远 - 脚本通常需要2-3分钟才能运行,完整的跟踪已经持续数小时.
每次调用特定类的方法时,我都需要执行某些操作(例如记录方法名称).如何在Python中以通用方式实现这一目标?
我想在源代码中获取python函数的行号.我在运行时拥有的是模块,类,方法对象
看看检查
inspect.getsourcelines(object)
Run Code Online (Sandbox Code Playgroud)
这也给出了行号.
我看到对于带有装饰器的方法,行号.从上面检查功能点返回到实际装饰器的源代码而不是所需函数的源代码.那么解决这个问题的方法有哪些呢?(我知道解释器在运行时执行类似于装饰器内部的函数包装,但我可能错了)
这个问题涉及Python 3。有没有办法让装饰器打印任何函数的返回值?这个问题装饰器打印函数调用详细信息 - 参数名称和有效值将打印您传递给函数的所有值。有没有办法让装饰器打印函数返回的值,无论它返回单个值还是多个值?
所以如果你要运行这个:
multiply(subtract(add(1,2),add(3,4)),9)
Run Code Online (Sandbox Code Playgroud)
所有用 @superecho 修饰的函数都会记录:
function call add() 1,2
function add() returns 3
function call add() 3,4
function add() returns 7
function call subtract() 3 7
function subtract() returns -4
function call multiply() -4 9
function multiply() returns -36
Run Code Online (Sandbox Code Playgroud)