首页 > 编程语言 >debug解决实际问题--python

debug解决实际问题--python

时间:2023-12-15 11:12:08浏览次数:27  
标签:est no -- frame list treaty python charge debug

简述:原代码一直报错,提示索引超出范围"IndexError: tuple index out of range"

一、原代码:

# -*- coding: utf-8 -*-
import pymysql, datetime
# 获取框架合约数据
def frame_treaty_get(frame_treaty_no_list):
    frame_treaty_list = []
    for frame_treaty_no in frame_treaty_no_list:
        sql = f"select frame_treaty_no,start_date,due_date from frame_treaty where frame_treaty_no = '{frame_treaty_no}'"
        frame_treaty_list.append(conn_db(sql))
    return frame_treaty_list
# 连接数据库
def conn_db(sql):
    conn = pymysql.connect(host='10.xxx.66.84',
                           port=3306,
                           user='test',
                           password='test@1234',
                           db='test',
                           charset="utf8")
    cursor = conn.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    return results
# 获取预估流量费
def est_flow_charge_get(dates):
    sql = f"select * from est_flow_charge where trading_day ='{dates}'"
    est_flow_charge_list = conn_db(sql)
    # print(len(est_flow_charge_list))
    frame_treaty_no_list = []
    for i in range(len(est_flow_charge_list)):
        frame_treaty_no_list.append(est_flow_charge_list[i][1])
    # if est_flow_charge_list[0][1]
    # print(est_flow_charge_list[0][1])
    # print(frame_treaty_no_list)

    frame_treaty_list = frame_treaty_get(frame_treaty_no_list)
    frame_treaty_eff_list = []
    # print(frame_treaty_list)
    # print(len(frame_treaty_list))
    if len(frame_treaty_list) == 0:
        print('合约列表为空')
    else:
        for index in range(len(frame_treaty_list)):
            if dates >= frame_treaty_list[index][1] and dates<= frame_treaty_list[index][2]:
                frame_treaty_eff_list.append(frame_treaty_list[index][0])
        for index in range(len(frame_treaty_no_list)):
            if frame_treaty_no_list[index] in frame_treaty_eff_list:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'应产生预估流量费,一致')
            else:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'不应产生预估流量费,错误')
        for index in range(len(frame_treaty_eff_list)):
            if frame_treaty_eff_list[index] in frame_treaty_list:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'是存续期合约,已产生预估流量费,一致')
            else:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'是存续期合约,未产生预估流量费,错误')

if __name__ == '__main__':
    dates = '2023-12-01'
    # dates = datetime.date.today()  获取当日日期
    est_flow_charge_get(dates)

 

二、解决过程

1.解决方法:

debug + Evaluate Expression

2.bug原因:

frame_treaty_list列表里不是直接就是元组(合约编号, 合约起始日, 合约到期日),而是元组里套元组((合约编号, 合约起始日, 合约到期日),),所以需要取两次  

 

 

 

三、解决后的代码:

# -*- coding: utf-8 -*-
import pymysql, datetime
# 获取frame_treaty_no_list列表,所有合约的起始日、到期日
def frame_treaty_get(frame_treaty_no_list):
    frame_treaty_list = []
    for frame_treaty_no in frame_treaty_no_list:
        sql = f"select frame_treaty_no,start_date,due_date from frame_treaty where frame_treaty_no = '{frame_treaty_no}'"
        frame_treaty_list.append(conn_db(sql))
    return frame_treaty_list
# 连接数据库
def conn_db(sql):
    conn = pymysql.connect(host='10.xxx.66.84',
                           port=3306,
                           user='test',
                           password='test@1234',
                           db='test',
                           charset="utf8")
    cursor = conn.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    return results
# 获取预估流量费
def est_flow_charge_get(dates):
    sql = f"select * from est_flow_charge where trading_day ='{dates}'"
    est_flow_charge_list = conn_db(sql)
    # print(len(est_flow_charge_list))
    frame_treaty_no_list = []
    for i in range(len(est_flow_charge_list)):
        frame_treaty_no_list.append(est_flow_charge_list[i][1])
    # if est_flow_charge_list[0][1]
    # print(est_flow_charge_list[0][1])
    # print(frame_treaty_no_list)

    frame_treaty_list = frame_treaty_get(frame_treaty_no_list)
    frame_treaty_eff_list = []
    print(frame_treaty_list)
    # print(len(frame_treaty_list))
    if len(frame_treaty_list) == 0:
        print('合约列表为空')
    else:
        for index in range(len(frame_treaty_list)):
            print(index)
            if dates >= str(frame_treaty_list[index][0][1]) and dates<= str(frame_treaty_list[index][0][2]):
                frame_treaty_eff_list.append(frame_treaty_list[index][0][0])
        for index in range(len(frame_treaty_no_list)):
            if frame_treaty_no_list[index] in frame_treaty_eff_list:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'应产生预估流量费,一致')
            else:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'不应产生预估流量费,错误')
        for index in range(len(frame_treaty_eff_list)):
            if frame_treaty_eff_list[index] in frame_treaty_no_list:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'是存续期合约,已产生预估流量费,一致')
            else:
                print(str(dates)+'日, '+str(frame_treaty_no_list[index])+'是存续期合约,未产生预估流量费,错误')

if __name__ == '__main__':
    dates = '2023-12-01'
    # dates = datetime.date.today()  获取当日日期
    est_flow_charge_get(dates)

  

 

标签:est,no,--,frame,list,treaty,python,charge,debug
From: https://www.cnblogs.com/lx001/p/17902940.html

相关文章

  • shell补-循环案例-循环case
    shell补-循环案例-循环casecase结构条件的语法格式;一般应用菜单的功能case$变量名in"值1")###如果变量的值1,则执行此程序1;;"值2")###如果变量的值2,则执行此程序2;;###....省略其他分支YES|yes|Yes)#####此处的值,可以带些符号,比如|表示或者;也可以用[a-z]感觉......
  • window mysql 自动按日期备份Sql脚本
    一、背景这几天数据中了病毒,服务器被黑,Mysql数据库遭比特币勒索!!!数据库有开启binlog那就还有恢复的可能。那么恭喜你可以参考这篇文章https://zhuanlan.zhihu.com/p/311435595如果没有开启,那没办法了,只能吃一堑长一智,要么数据库做同步【做新增、修改,切记删除的不要同步】,要么数......
  • WPF实现边缘依靠效果
    最近做的某个功能需要用到边缘依靠,WPF实现了下,效果如下  主要实现原理如下:1、增加一块热点区域,鼠标进入时,触发显示动画,并隐藏热点区域2、鼠标拖动或离开窗体,判断窗体离屏幕边缘的距离,符合条件的,触发隐藏动画,并显示热点区域3、使用Window.Left属性进行窗体动画 需要注意......
  • cmake 的使用
    cmake简介cmake是一个软件自动化构建工具,在使用C/C++编写程序的时候,多个源文件编译一般是通过makefile工具进行编译生成。可以通过使用cmake生成一个makefile文件,再通过makefile文件生成程序。简而言之:cmake用于生成makefile文件,makefile文件用于编译源文件生成程序。......
  • shell补-特殊玩法-生成随机字符串
    shell补-特殊玩法-生成随机字符串方法1:md5sum方法2:tr+/dev/urandom方法3:内置变量RANDOM;#方法1[root@localhostser]#opensslrand-base64108/54arQpCmQ12Q==[root@localhostser]##方法2必备[root@localhostser]#date+%N|md5sum###给日期加密;可以写其......
  • SFP6006-ASEMI新能源功率器件SFP6006
    编辑:llSFP6006-ASEMI新能源功率器件SFP6006型号:SFP6006品牌:ASEMI封装:TO-247最大平均正向电流:60A最大重复峰值反向电压:600V产品引线数量:3产品内部芯片个数:2产品内部芯片尺寸:140MIL峰值正向漏电流:<10ua恢复时间:35ns浪涌电流:600A芯片材质:最大正向电压:0.98V~1.90V工作......
  • shell补-特殊玩法-批量修改文件
    shell补-特殊玩法-批量修改文件几个其他方法;感觉最简单的就是rename###方法3rename#rename找谁,替换为什么范围[root@localhostrandom]#ll总用量0-rw-r--r--.1rootroot011月1716:03bcauiftqdr.mrxu.html-rw-r--r--.1rootroot011月1716:03dkjoyp......
  • 过瑞数中的高级debugger
    (function(){vara=newDate();debugger;returnnewDate()-a>100;}())这种debugger如果是用‘一律不在此处暂停’是过不去的。 要在浏览器的控制台中执行并阻止debugger语句,你可以使用JavaScript的toString()方法来重写原函数的定义。这种方法......
  • shell补-特殊玩法-批量修改密码
    shell补-特殊玩法-批量修改密码写一个脚本批量添加用户和随机密码root@localhostusr]#bashrandomadduser.sh更改用户mrrxu00001的密码。passwd:所有的身份验证令牌已经成功更新。更改用户mrrxu00002的密码。passwd:所有的身份验证令牌已经成功更新。更改用户mrr......
  • Go语言学习之-带分割符的文件转excel-PLUS版
    packagemainimport( "bufio" "errors" "flag" "fmt" "github.com/axgle/mahonia" "github.com/xuri/excelize/v2" "log" "os" "path" "path/filepath" ......