lamupen 发表于 2020-7-28 22:55:16

冰天雪地果体跪求DEBUG

import easygui as g
import os

codingdict = {}
typedict = {}
linecountdict = {}


def ChoiceCountType():
    '''选择要统计哪些代码文件类型'''
    global codingdict
    global typedict
    global linecountdict

    choices = [".py", ".c", ".cpp", ".txt", ".cs", ".aspx"]# 设置代码文件选项
    usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
    codingdict = dict.fromkeys(usertype, )# 给类型字典赋初值{类型,[个数,有效代码数]}
    # typedict=dict.fromkeys(usertype,0)
    # linecountdict=dict.fromkeys(usertype,0)
    dirpath = g.diropenbox()
    # print(codingdict)
    return dirpath


def calc_code(paths, file_name):
    '''统计有效代码行的函数'''
    codinglines = 0
    with open(paths + "\\" + file_name, errors="ignore") as fp:
      print('正在分析文件:%s ...' % file_name)
      dateline = fp.readlines()
      for line in dateline:
            if line == "\n":
                continue
            elif line.startswith("#"):
                continue
            else:
                codinglines += 1
    return codinglines


def ChoiceDir(dirpath):
    '''用os.walk()遍历计算文件数量和有效代码数分别存进对应列表中'''
    # global typedict
    # global linecountdict
    global codingdict

    for paths, dirs, files in os.walk(dirpath):
      if len(files) > 0:# 如果有文件,就执行下一步的遍历文件列表
            for file in files:
                ext = os.path.splitext(file)# 切片出类型,然后判断出类型在不在编程类型文件里
                if ext in codingdict.keys():# 如果切出来的类型在字典的KEY中
                  lines = calc_code(paths, file)# 统计当前文件有效行数
                  codingdict += lines   #字典[当前文件类型][该类型有效行数]自增lines
                  codingdict += 1         #字典[当前文件类型][该类型文件个数]自增1


def ShowResult():
    msg = ""
    text = ""
    title = "统计结果"
    totallines = 0
    chaju = 0

    for each in codingdict.keys():
      text+=(f"[{each}]类型的文件有{codingdict}个,共计有效代码量{codingdict}行\n")
      totallines+=codingdict

    jindu = "%.2f %%" % (totallines / 1000)
    if (100000 - totallines) <= 0:
      msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n你已经完成了10万行代码的代码量,牛逼的哟!"
    else:
      chaju = 100000 - totallines
      msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n离 10 万行代码还差{chaju}行,请继续努力!"
    g.textbox(msg, title, text)


# 主程序
openpath = ChoiceCountType()
ChoiceDir(openpath)
ShowResult()



断点测试了下,问题应该是出在了    for paths, dirs, files in os.walk(dirpath):
      if len(files) > 0:# 如果有文件,就执行下一步的遍历文件列表
            for file in files:
                ext = os.path.splitext(file)# 切片出类型,然后判断出类型在不在编程类型文件里
                if ext in codingdict.keys():# 如果切出来的类型在字典的KEY中
                  lines = calc_code(paths, file)# 统计当前文件有效行数
                  codingdict += lines   #字典[当前文件类型][该类型有效行数]自增lines
                  codingdict += 1         #字典[当前文件类型][该类型文件个数]自增1
这段代码里,原本想象是每遍历一个文件,如果ext在key里,那codingdict[对应文件后缀](文件个数)及(该类型有效行数)都对应的增加。
断点测试时发现是字典里所有key对应的值都增加了,并不是对应的文件类型增加。老哥们这个得咋整?

Twilight6 发表于 2020-7-28 23:22:40

本帖最后由 Twilight6 于 2020-7-28 23:25 编辑


不用 fromkeys

import easygui as g
import os

codingdict = {}
typedict = {}
linecountdict = {}


def ChoiceCountType():
    '''选择要统计哪些代码文件类型'''
    global codingdict
    global typedict
    global linecountdict

    choices = [".py", ".c", ".cpp", ".txt", ".cs", ".aspx"]# 设置代码文件选项
    usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
    codingdict = {}
    for i in usertype:
      codingdict =
    # typedict=dict.fromkeys(usertype,0)
    # linecountdict=dict.fromkeys(usertype,0)
    dirpath = g.diropenbox()
    # print(codingdict)
    return dirpath


def calc_code(paths, file_name):
    '''统计有效代码行的函数'''
    codinglines = 0
    with open(paths + "\\" + file_name, errors="ignore") as fp:
      print('正在分析文件:%s ...' % file_name)
      dateline = fp.readlines()
      for line in dateline:
            if line == "\n":
                continue
            elif line.startswith("#"):
                continue
            else:
                codinglines += 1
    return codinglines


def ChoiceDir(dirpath):
    '''用os.walk()遍历计算文件数量和有效代码数分别存进对应列表中'''
    # global typedict
    # global linecountdict
    global codingdict

    for paths, dirs, files in os.walk(dirpath):
      if len(files) > 0:# 如果有文件,就执行下一步的遍历文件列表
            for file in files:
                ext = os.path.splitext(file)# 切片出类型,然后判断出类型在不在编程类型文件里
                if ext in codingdict.keys():# 如果切出来的类型在字典的KEY中
                  lines = calc_code(paths, file)# 统计当前文件有效行数
                  codingdict += lines   #字典[当前文件类型][该类型有效行数]自增lines
                  codingdict += 1         #字典[当前文件类型][该类型文件个数]自增1


def ShowResult():
    msg = ""
    text = ""
    title = "统计结果"
    totallines = 0
    chaju = 0

    for each in codingdict.keys():
      text+=(f"[{each}]类型的文件有{codingdict}个,共计有效代码量{codingdict}行\n")
      totallines+=codingdict

    jindu = "%.2f %%" % (totallines / 1000)
    if (100000 - totallines) <= 0:
      msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n你已经完成了10万行代码的代码量,牛逼的哟!"
    else:
      chaju = 100000 - totallines
      msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n离 10 万行代码还差{chaju}行,请继续努力!"
    g.textbox(msg, title, text)


# 主程序
openpath = ChoiceCountType()
ChoiceDir(openpath)
ShowResult()

lamupen 发表于 2020-7-28 23:28:53

Twilight6 发表于 2020-7-28 23:22
不用 fromkeys

成了,竟然是fromkeys的原因。我断点看了半天就是一直每弄懂为啥会全加{:10_266:}。
老哥还是你稳,感激不尽,这个真的是学到了。{:7_146:}

lamupen 发表于 2020-7-28 23:34:10

Twilight6 发表于 2020-7-28 23:22
不用 fromkeys

老哥,如果值会占用同一个地址,那这个方法啥情况下使用是优选?

Twilight6 发表于 2020-7-28 23:35:28

lamupen 发表于 2020-7-28 23:34
老哥,如果值会占用同一个地址,那这个方法啥情况下使用是优选?



容器类型的会,不可变类型就没事~比如int、 str 、float

页: [1]
查看完整版本: 冰天雪地果体跪求DEBUG