递归错误:我在寻找一种减少循环次数的方法

2024-10-03 06:30:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找我的代码优化,以避免以下错误,使我的程序更快。 maximum recursion depth exceeded while calling a Python object

我希望在docker容器中执行此代码。它在我的机器上运行得很好。你知道吗

我在寻找一种减少循环次数的方法。你知道吗

def reidentify(self):
        try:
            # Check if file is re-identify
            self.check_if_dicom_is_reidentify()

            LOGGER.info(f"Anonymization in progress for {self.dirpath_output}")

            # Get patient data
            json_data = json.loads(self.get_patient_data().decode('utf-8'))

            # Re-identification
            archive = zipfile.ZipFile(self.download.dirpath_download, 'r')

            for file in archive.namelist():

                # Check if the file is a dicom
                if not file.endswith('.dcm'):
                    continue

                # Reading dicom file
                dicom_data = io.BytesIO(archive.read(file))
                ds = pydicom.dcmread(dicom_data)

                # Edit Dicom general fields
                for key in json_data['tags']:
                    ds.data_element(key).value = json_data['tags'][key]

                # Edit Dicom series field
                for key in json_data['series']:
                    if key['obfuscated_uid'] != ds.data_element('SeriesInstanceUID').value:
                        continue

                    for tag in key['tags']:
                        ds.data_element(tag).value = key['tags'][tag]

                # Save re-identify dicom
                ds.save_as(f'{self.dirpath_tmp}/{os.path.basename(file)}')

        except Exception as e:
            LOGGER.error(e)

这段代码给出了预期的结果,但我认为它不是一个优化的方法,而且速度非常慢。你知道吗

编辑:这是堆栈跟踪

reidentify_1  | 2019-10-17 11:29:53,001] With tag (0010, 1030) got exception: maximum recursion depth exceeded while calling a Python object
reidentify_1  | Traceback (most recent call last):
reidentify_1  |   File "/usr/local/lib/python3.8/site-packages/pydicom/tag.py", line 30, in tag_in_exception
reidentify_1  |     yield
reidentify_1  |   File "/usr/local/lib/python3.8/site-packages/pydicom/filewriter.py", line 541, in write_dataset
reidentify_1  |     write_data_element(fp, dataset.get_item(tag), dataset_encoding)
reidentify_1  |   File "/usr/local/lib/python3.8/site-packages/pydicom/filewriter.py", line 485, in write_data_element
reidentify_1  |     writer_function(buffer, data_element)
reidentify_1  |   File "/usr/local/lib/python3.8/site-packages/pydicom/filewriter.py", line 338, in write_number_string
reidentify_1  |     val = str(val)
reidentify_1  |   File "/usr/local/lib/python3.8/site-packages/pydicom/valuerep.py", line 344, in __str__
reidentify_1  |     return super(DSfloat, self).__str__()
reidentify_1  |   File "/usr/local/lib/python3.8/site-packages/pydicom/valuerep.py", line 347, in __repr__
reidentify_1  |     return "\"" + str(self) + "\""

非常感谢你的帮助。你知道吗


Tags: keyinselfdatalibusrlocaltag
1条回答
网友
1楼 · 发布于 2024-10-03 06:30:33

它看起来是fixed,但是没有使用该修复构建pypi package。你知道吗

此错误的来源描述如下:

Python 3.8 removes str() from int and float which instead now call object.str() which itself defaults to object.repr().

DSfloat.str(), DSfloat.repr() and IS.repr() all call the parent class' str() which calls the subclass' repr() method and so on, which causes a recursion error.

This PR:

Fixes DSfloat.__str__() by creating a calling repr() instead and removing the " marks.
Fixes DSfloat.__repr__() by calling the parent class' __repr__() instead of str()
Fixes IS.__repr__() by implementing IS.__str__() in a similar manner to DSfloat.__str__() and making IS.__repr__() symmetric with

DSfloat.repr()


您可以尝试直接从git repo安装它:

pip uninstall pydicom
pip install git+https://github.com/pydicom/pydicom.git

相关问题 更多 >