【问题标题】:How to reset dictionary on each iteration of for loop如何在 for 循环的每次迭代中重置字典
【发布时间】:2021-06-30 21:29:50
【问题描述】:

下面是我打开目录中每个文件并查找类数、函数数、字符数和行数的代码。当我打印输出时字典值加起来,我该如何避免这种情况?

import os
class FileAnalyzer:
    
    def __init__(self, directory: str) -> None:
       
        self.directory: str = directory # NOT mandatory!
        self.files_summary: Dict[str, Dict[str, int]] = dict() 
        self.cnt=0
        self.c=0
        self.cc=0
        self.ct=0
        self.analyze_files() # summerize the python files data

    def analyze_files(self) -> None:
        
        
        for filename in os.listdir(self.directory):
            if filename.endswith(".py"):
                with open(os.path.join(self.directory, filename), 'r') as f:
                    
                    for line in f:
                        
                        self.c+=1
                        line = line.lstrip()    
                        if line.startswith("class "):
                            self.cnt+=1
                        
                        if line.startswith("def "):
                            self.ct+=1
                        # Move to the start of file
                        for i in line:
                            if not line.startswith(" "):
                                self.cc+=1
                        self.files_summary[filename] = {"class":self.cnt,"function":self.ct,"line":self.c,"char":self.cc}                    
                for k,v in self.files_summary.items():
                    print (k,v)

以下是我正在使用的两个输入文件:

file1.py:

definitely not function

This is def not a function def 

file2.py:

"""
    This file has:
        - 2 classes
        - 4 functions
        - 25 lines
        - 270 characters
"""

def func1():
    pass

def func2():
    pass

class Foo:
    def __init__(self):
        pass

class Bar:
    def __init__(self):
        pass


if __name__ == "__main__":
    main()

我得到的输出是:

file1.py {'class': 0, 'function': 0, 'line': 3, 'char': 56}
file1.py {'class': 0, 'function': 0, 'line': 3, 'char': 56}
file2.py {'class': 2, 'function': 4, 'line': 28, 'char': 275}

预期输出:

file1.py {'class': 0, 'function': 0, 'line': 3, 'char': 56}
file2.py {'class': 2, 'function': 4, 'line': 25, 'char': 219}

我得到了 file1 的重复,并且在循环第二个文件时添加了计数。

【问题讨论】:

  • 您可以在这里使用ast 模块让生活更轻松、更强大

标签: python-3.x file class dictionary self


【解决方案1】:
    def analyze_files(self) -> None:
        for filename in os.listdir(self.directory):
            if filename.endswith(".py"):
                ...
                for k,v in self.files_summary.items():
                    print (k,v)

您在每个循环中打印文件摘要。您可能希望在分析完所有文件后打印文件摘要。

    def analyze_files(self) -> None:
        for filename in os.listdir(self.directory):
            if filename.endswith(".py"):
                ...
        for k,v in self.files_summary.items():
            print (k,v)

另外,您需要在每个循环之后重置self.cntself.ctself.cself.cc

        for filename in os.listdir(self.directory):

            if filename.endswith(".py"):
               ...
            self.cnt, self.ct, self.c, self.cc = 0, 0, 0, 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多