擅长:python、mysql、java
<p>您的代码似乎很混乱,尽管您声明自己是不值得尊敬的装饰器。在</p>
<p>我希望你不要相信如果你做了这样的事情:</p>
<pre><code>def auth_required(is_authenticated):
def check_authentication(f):
if is_authenticated:
return f
return check_authentication
@auth_required(something)
def my_function():
....
</code></pre>
<p>意味着“something”变量在导入时被检查,并且只检查一次,并且您的修饰函数将被取消-也就是说,“mu function”的名称将绑定到<code>None</code>,在任何试图调用该变量的代码中都会导致错误。如果替换return None返回一个不执行任何操作的函数,以解决该错误,则在重新加载包含该函数的模块之前(在测试场景中,这通常意味着再次运行所有内容),这一点仍然是不可更改的。在</p>
<p>所以,这不仅仅是错误的,它表明你对装饰师的所作所为感到困惑。在</p>
<p>依赖全局变量以这种方式打开和关闭函数会更简单:</p>
^{pr2}$
<p>现在,这个decorator可以通过在调用之间的运行时更改<code>is_authenticated</code>模块级变量来随意打开和关闭装饰函数—不需要重新加载模块。在</p>
<p>同样,回到您的标题问题“multiplepython decorators retrieve original function”:
注意,我在上面的包装器代码中添加了<code>functools.wraps</code>装饰器。在最近的Python中,这个函数在修饰函数上设置一个<code>__wrapped__</code>属性,该属性指向最初的修饰函数。在</p>
<p>因此,如果所有的decorator都表现良好并在其包装器上应用<code>functools.wraps</code>,那么您可以通过
使用其<code>__wrapped__</code>属性。在</p>