1.代码如下:问题,运行login.py,输出两次func函数
![]()
login.py
from decrator import authicate
def checkuser_logged_in(re):
if re == "1":
return True
elif re == "2":
return False
@authicate
def post_comment(res):
return "评论成功+" + res
result = post_comment(‘1‘)
print(result)
decrator.py
def authicate(func):
def wrapper(*args, **kwargs):
request = args[0]
from login import checkuser_logged_in#这里导入了login模块,因此会将整个login模块中的函数运行一次,即装饰器运行了两次
if checkuser_logged_in(request):
ret=func(*args, **kwargs)
else:
raise Exception(‘Authentication f‘)
return ret
return wrapper
如何让func函数不会执行两次呢,加if __name__ == ‘__main__‘:下方的代码是用来执行仅限于当前文件被执行的时候才会被执行的代码
具体原因在login.py,打印print(__name__)会发现输出为__main__,因此即当login模块的__name__==__main__的时候,下面的代码才会被执行,这样就保护了该模块的代码不会因为导入的原因在其他模块中执行时被执行??????要真正理解导入模块;
修改后login代码:
from decrator import authicate
def checkuser_logged_in(re):
if re == "1":
return True
elif re == "2":
return False
@authicate
def post_comment(res):
return "评论成功+" + res
if __name__ == ‘__main__‘:
result = post_comment(‘1‘)
print(result)
2.还是上面的代码,from login import checkuser_logged_in,放在了装饰器函数哪,这是因为如果放在文件头部,运行login会报错:
ImportError: cannot import name ‘authicate‘ from ‘decrator‘
报错原因:login.py、decrator.py之间存在互相调用关系
解决方案:把循环调用的包引入信息放在函数内。只要一方的引用信息放在函数里即可,不必两边都放
原文:https://www.cnblogs.com/zhaikunkun/p/12658613.html