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

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

原文地址:https://www.cnblogs.com/zhaikunkun/p/12658613.html

时间: 2024-07-30 11:05:10

python踩坑记录的相关文章

【Pysc2】Deepmind Pysc2 环境配置及其踩坑记录

1. 下载星际争霸II游戏 可以直接下暴雪战网,然后在战网内下载. 2. 下载Pysc2 cmd后在命令行输入 pip install pysc2 3. 下载sc2 cmd后在命令行输入 pip install sc2 4. 下载地图 https://github.com/ClausewitzCPU0/SC2AI 解压密码: iagreetotheeula (表示自己同意最终用户许可协议) 解压在Maps的文件夹,我是使用的暴雪战网下载的游戏,发现游戏文件夹里并没有Maps, 需要自己手动创建.

unionId突然不能获取的踩坑记录

昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html),unionid可以在第二步(https://api.weixin.qq.com/sns/oauth2/access_token)和第四步的2个接口中获得.其中,第四步的接口是

IDFA踩坑记录

IDFA踩坑记录: 1.iOS10.0 以下,即使打开"限制广告跟踪",依然可以读取idfa: 2.打开"限制广告跟踪",然后再关闭"限制广告跟踪",idfa会改变: 3.越狱机器安装开发证书打的包,读取的idfa正常: 4.越狱机器安装本地打的发布证书的包,读取idfa异常,第一次打开app读取的是一个错误的idfa,第二次打开会变成另外一个错误的idfa: 5.越狱机器安装Testflight的包,读取idfa异常,第一次打开app读取的是一

Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼

目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜单 - Python踩坑指南代码示例 1.1 踩坑案例 小明是个服务器管理员, 他从老管理员手里接手了一个非常繁琐的运维工作: 短暂授权root 账号给不同的 team 接口人运行备份任务 该运维任务有几个特点: 任务需且仅需运行在 root 下 root 账号只能短暂授权给各个小组 通过账号管理平

Linux Git 踩坑记录

Linux Git 踩坑记录 git cherry-pick 冲突解决 出现: error: could not apply xxxxxx(commit ID)... ***** hint: after resolving the conflicts, mark the corrected paths hint: with 'git add ' or 'git rm ' hint: and commit the result with 'git commit' 此时使用git status命令查

java用毫秒数做日期计算的一个踩坑记录

错误示例: Date today = new Date(); Date nextMonth = new Date(today.getTime() + 30* 1000*60*60*24); println(today); println(nextMonth); Result:  Sat Sep 30 11:18:24 CST 2017 Sun Sep 10 18:15:37 CST 2017 代码说明:上面代码的目的是计算一个月后的日期,从结果发现明显是错误的(回到上个月去了) 原因分析:30*

微信小程序之蓝牙 BLE 踩坑记录

前言 前段时间接手了一个微信小程序的开发,主要使用了小程序在今年 3 月开放的蓝牙 API ,此过程踩坑无数,特此记录一下跳坑过程.顺便开了另一个相关的小项目,欢迎 start 和 fork: BLE_MiniProgram API简介 微信小程序目前有蓝牙 API 共 18 个,其中操作蓝牙适配器的共有 4 个,分别是 wx.openBluetoothAdapter 初始化蓝牙适配器 wx.closeBluetoothAdapter 关闭蓝牙模块 wx.getBluetoothAdapterS

Python踩坑之旅其一杀不死的Shell子进程

1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行: a. 多线程的网络通信包处理 和控制Master节点交互 有固定Listen端口 b. 定期作业任务, 通过subprocess.Pipe执行shell命令 c. etc 发现坑的过程很有意思: a.重启Agent发现Port被占用了 => 立刻想到可能进程没被杀死, 是不是停止脚本出问题 => 排除发现不是, Agent进程确实死亡了 => 通过 netstat -tanop|grep p

.NET CORE2.2 下 Ocelot+Consul服务发现踩坑记录

历史原因,笔者所在公司的项目目前还在使用 .NET CORE 2.2版本,在所有业务应用升级完成服务注册发现之后,最后剩下 Ocelot 网关服务升级.在升级过程中,遇到一些问题,记录此文,以便有相同情况的同学参考. 1. Ocelot 升级服务发现 根据官方文档 ,通过简单的添加配置,既可以将原有配置方式改为服务发现: 安装插件 Install-Package Ocelot.Provider.Consul 13.5.2,.Net Core 2.x 最后一个版本 配置服务 s.AddOcelot