我的问题是我必须在不同的功能之间传递trace_id
。
因此,如果funA calls funB, funB calls funC and funC calls funD
,我会在funA
生成一个trace_id,并在funD
访问它。此trace_id必须是本地堆栈。
但是我不想将它作为参数传递,而是作为隐藏变量传递。原因是funA and funD
是我的框架的一部分,而框架的用户写funB and funC.
我可以检查当前帧但问题是funA被装饰并且装饰器生成了这个trace_id。所以使用
trace_id = frame[0].f_locals.get('x_trace_id', None)
不起作用。
我现在能做什么?
答案 0 :(得分:1)
在Python中,funA和funD很容易通过import语句访问共享的全局命名空间。如果它们都导入模块,则该模块中的名称将被共享。这样,您就可以在不修改干预呼叫的情况下在它们之间共享数据。
您提到要分享的变量在某种意义上应该是堆栈或线程本地的。为了使其工作,您可以使“全局”模块中的共享对象成为由标识符键入的字典,例如,线程ID。在这种情况下,frame[0]
是可能的。