Python 禁用某个函数崩溃的装饰器
Python decorator to disable a certain function crashing
我在 python 中有一个在许多视图中使用的函数。特别是它在 uwsgi 下的 django 应用程序 运行 中。该函数只是将跟踪数据发送到我们的数据库中。我想创建一个装饰器,在对包含该函数的视图进行特定调用时禁用该函数。本质上:
@disable tracking
def view(request):
track(request) //disabled by decorator
装饰器的工作原理是将 track 的全局定义替换为不执行任何操作的 void 函数。由于我们在 uwsgi 下 运行 这是多线程的,如果我替换一个全局定义,它将替换进程下所有线程 运行 的函数,所以我定义装饰器仅在 tid 和pid 是等价的。这里:
def disable_tracking(func):
#decorator
def inner(*args, **kwargs):
original_tracker = pascalservice.track.track
anon = lambda *args, **kwargs: None
tid = lambda : str(current_thread().ident)
pid = lambda : str(getpid())
uid = lambda : tid() + pid()
current_uid = uid()
cache.set(current_uid, True)
switcher = lambda *args, **kwargs: anon(*args, **kwargs) if cache.get(uid()) else original_tracker(*args, **kwargs)
pascalservice.track.track = switcher
result = func(*args, **kwargs)
cache.delete(current_uid)
pascalservice.track.track = original_tracker
return result
return inner
这个装饰函数的奇怪之处在于我偶尔会崩溃,我想验证这种编码风格是否正确,因为它有点不合常规。
你所做的叫做猴子修补。虽然这不是一个完全糟糕的做法,但它通常会导致难以查明错误,因此请谨慎使用。
如果出于某种原因装饰器是强制性的,我建议在装饰器中向请求对象添加一些标志,并在跟踪函数中添加对该标志的检查。
装饰者:
def disable_tracking(func):
def wrapper(*args, **kwargs):
kwargs["request"].pascalservice_do_not_track = true
return func(*args, **kwargs)
return wrapper
跟踪功能的开始:
if hasattr(request, "pascalservice_do_not_track"):
return
# do the tracking ...
您也可以只评论您视图中的线路调用轨迹。
我在 python 中有一个在许多视图中使用的函数。特别是它在 uwsgi 下的 django 应用程序 运行 中。该函数只是将跟踪数据发送到我们的数据库中。我想创建一个装饰器,在对包含该函数的视图进行特定调用时禁用该函数。本质上:
@disable tracking
def view(request):
track(request) //disabled by decorator
装饰器的工作原理是将 track 的全局定义替换为不执行任何操作的 void 函数。由于我们在 uwsgi 下 运行 这是多线程的,如果我替换一个全局定义,它将替换进程下所有线程 运行 的函数,所以我定义装饰器仅在 tid 和pid 是等价的。这里:
def disable_tracking(func):
#decorator
def inner(*args, **kwargs):
original_tracker = pascalservice.track.track
anon = lambda *args, **kwargs: None
tid = lambda : str(current_thread().ident)
pid = lambda : str(getpid())
uid = lambda : tid() + pid()
current_uid = uid()
cache.set(current_uid, True)
switcher = lambda *args, **kwargs: anon(*args, **kwargs) if cache.get(uid()) else original_tracker(*args, **kwargs)
pascalservice.track.track = switcher
result = func(*args, **kwargs)
cache.delete(current_uid)
pascalservice.track.track = original_tracker
return result
return inner
这个装饰函数的奇怪之处在于我偶尔会崩溃,我想验证这种编码风格是否正确,因为它有点不合常规。
你所做的叫做猴子修补。虽然这不是一个完全糟糕的做法,但它通常会导致难以查明错误,因此请谨慎使用。
如果出于某种原因装饰器是强制性的,我建议在装饰器中向请求对象添加一些标志,并在跟踪函数中添加对该标志的检查。
装饰者:
def disable_tracking(func):
def wrapper(*args, **kwargs):
kwargs["request"].pascalservice_do_not_track = true
return func(*args, **kwargs)
return wrapper
跟踪功能的开始:
if hasattr(request, "pascalservice_do_not_track"):
return
# do the tracking ...
您也可以只评论您视图中的线路调用轨迹。