Ошибка отладчика Python – цикл for заканчивается блоком ifPython

Программы на Python
Ответить
Anonymous
 Ошибка отладчика Python – цикл for заканчивается блоком if

Сообщение Anonymous »

У меня есть скрипт Python со следующей базовой структурой:

Код: Выделить всё

import os
import glob
import re

class ClassInfo():
pass

def read_busclass_files():
pattern = os.path.join(os.path.dirname(__file__), "*.txt")

matching_files = glob.glob(pattern)

re_block_with_rules = re.compile(r"( {0,3}\t| {4})(Audit Entry Rules|Field Rules|Commit Rules|Create Rules|Create Exit Rules|Delete Rules|Attach Rules|Translation Field Rules|Apply Pending Effective Rules|Translation Rules|Action Exit Rules|Parent Attach Rules|Dynamic Creation Rules)\s*(\/\/.*)?$")
re_relations = re.compile(r"( {0,3}\t| {4})Relations\s*(\/\/.*)?$")
re_actions = re.compile(r"( {0,3}\t| {4})Actions\s*(\/\/.*)?$")
re_class_name = re.compile(r"(\w+)\s+is a BusinessClass\s*(\/\/.*)?$")

class_map: dict[str, ClassInfo] = {}

# Read each file
for file_path in matching_files:
try:
line_num = 0
action_info = None
class_name = None
action_name = None
with open(file_path, 'r') as f:
while True:
line = f.readline()
if not line:
break
line_num += 1
if len(line.strip()) == 0:
continue
line = line.rstrip()
if class_name is None:
class_name = re_class_name.match(line).group(1) if re_class_name.match(line) else "bad"
if class_name not in class_map:
class_map[class_name] = ClassInfo()
continue
if re_block_with_rules.match(line):
read_state = 1
for_each_nested = []
continue
if re_relations.match(line):
read_state = 2
continue
if re_actions.match(line):
read_state = 4
continue
if (action_info is not None):
class_map[class_name].actions[action_name] = action_info
except IOError as e:
print(f"Error reading file {file_path}: {e}")

return class_map

def main():
class_map = read_busclass_files()
return 0

if __name__ == "__main__":
exit(main())
Я положил в каталог со скриптом txt-файл с таким содержимым:

Код: Выделить всё

AbsenceCalculation is a BusinessClass
Relations
AbsenceTableDetailRel is an AbsenceTableDetail set  //Used in Computation field for edits
Назовите текстовый файл так, чтобы он был первым в массиве совпадающих файлов, например «atxtfile.txt». Затем добавьте еще один текстовый файл, чтобы шаблону *.txt соответствовало более одного файла.
Когда я запускаю сценарий без каких-либо точек останова, все в порядке. (Если я добавлю строку для отчета sys.version, она сообщит версию Python: 3.12.0 (tags/v3.12.0:0fb18b0, 2 октября 2023 г., 13:03:39) [MSC v.1935 64 бит (AMD64)] ).
Когда я запускаю сценарий в отладчике VS Code Python с точкой останова в if (action_info не имеет значения None):, выполнение прерывается на строке for с этой ошибкой:

Код: Выделить всё

Exception has occurred: TypeError
an integer is required
File "C:\landmark\ox1\src\hcm\scripts\tmp.py", line 29, in read_busclass_files
for file_path in matching_files:
File "C:\landmark\ox1\src\hcm\scripts\tmp.py", line 70, in main
class_map = read_busclass_files()
^^^^^^^^^^^^^^^^^^^^^
File "C:\landmark\ox1\src\hcm\scripts\tmp.py", line 74, in 
exit(main())
^^^^^^
TypeError: an integer is required
Ошибка возникает, если я ставлю точку останова if (action_info не имеет значения None):, запускаю скрипт, а затем пытаюсь перейти вперед, когда выполнение останавливается на этой строке ( выполнение этой строки каким-то образом вызывает ошибку в строке for.) Действительно ли это ошибка в отладчике Python?

Подробнее здесь: https://stackoverflow.com/questions/791 ... h-if-block
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»