python踩坑记录

Posted zhaikunkun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python踩坑记录相关的知识,希望对你有一定的参考价值。

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之间存在互相调用关系

解决方案:把循环调用的包引入信息放在函数内。只要一方的引用信息放在函数里即可,不必两边都放

 

  

以上是关于python踩坑记录的主要内容,如果未能解决你的问题,请参考以下文章

Fastlane 一键打包/发布APP - 使用记录及踩坑

Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

Python自动化测试踩坑记录(企业中如何实施自动化测试)

Python logging模块日志存储位置踩坑

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段

Appium+python使用过程中踩坑