擅长:python、mysql、java
<p>函数是一个对象,可以有属性。可以将上下文作为包装器的属性直接传递:</p>
<pre><code>def decme(f):
def wrapped(*args, **kwargs):
# here we can access the context passed as wrapped.context
print("Before context:", wrapped.context)
cr = f(*args, **kwargs)
print("After")
return cr
wrapped.context = None
return wrapped
def caller_function():
# just pass the context
call_me.context = context_creator()
call_me()
</code></pre>
<p>这里原始的<code>call_me</code>没有<code>context</code>属性的概念,但是修饰函数有。唯一的缺点是它是函数的一个属性,并且会在调用之间持续存在。特别是在多线程环境中,它将导致意外的结果。。。在</p>
<hr/>
<p>或者,可以使用decorator向函数添加一个附加参数,该参数可以在运行时传递。这种方式是线程安全的:</p>
^{pr2}$