Skip to content

Commit 08e54b8

Browse files
committed
ENH: Refactor code to remove six usage in iteration syntax.
This commit replaces `six.iteritems()` with Python 3's native `dict.items()` for iterating over dictionary items. The now unnecessary `six` import is removed, aligning the codebase with modern Python practices and enhancing maintainability. Support for Python2 was removed many years ago. Clean up the codebase by removing the conditional behaviors encoded with six.
1 parent b04127f commit 08e54b8

36 files changed

+94
-138
lines changed

CHANGES.rst

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -830,11 +830,6 @@ Bug fixes
830830
- Fix datatype error when calling ``SimpleITK.ResampleImageFilter.SetSize()`` (only causes error in python 3,
831831
`#205 <https://github.com/AIM-Harvard/pyradiomics/pull/205>`_)
832832

833-
Requirements
834-
############
835-
836-
- Add requirement for ``six>=1.10.0``, needed to make PyRadiomics compatible with both python 2 and 3.
837-
838833
Documentation
839834
#############
840835

@@ -865,8 +860,7 @@ Internal API
865860
feature classes and filters at initialization of the toolbox, and ensures feature classes are imported at
866861
initialization. (`#190 <https://github.com/AIM-Harvard/pyradiomics/pull/190>`_,
867862
`#198 <https://github.com/AIM-Harvard/pyradiomics/pull/198>`_)
868-
- Python 3 Compatibility. Add support for compatibility with python 2.7 and python >= 3.4. This is achieved using
869-
package ``six``.
863+
- Python 3 Compatibility is required
870864
- Standardize function names for calculating matrices in python and with C extensions to ``_calculateMatrix`` and
871865
``_calculateCMatrix``, respectively.
872866
- Make C code consistent with C89 convention. All variables (pointers for python objects) are initialized at top of each

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ available [here](https://github.com/AIM-Harvard/SlicerRadiomics).
152152
- numpy (Feature calculation)
153153
- PyWavelets (Wavelet filter)
154154
- pykwalify (Enabling yaml parameters file checking)
155-
- six (Python 3 Compatibility)
156155
- scipy (Only for LBP filter, install separately to enable this filter)
157156
- scikit-image (Only for LBP filter, install separately to enable this filter)
158157
- trimesh (Only for LBP filter, install separately to enable this filter)

bin/DatasetHierarchyReader.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import glob
66
import os
77

8-
import six
9-
108

119
class DatasetHierarchyReader(object):
1210
def __init__(self, inputDatasetDirectory, filetype='.nrrd'):
@@ -105,7 +103,7 @@ def findImageAndLabelPair(self, imageFilepaths, maskFilepaths, keywordSettings):
105103
"""
106104

107105
keywordSettings = {k: [str(keyword.strip()) for keyword in v.split(',')]
108-
for (k, v) in six.iteritems(keywordSettings)}
106+
for (k, v) in keywordSettings.items()}
109107

110108
matchedImages = []
111109
for imageFilepath in imageFilepaths:

bin/GenerateInputCSV_Filename.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import csv
44
import os
55

6-
import six
7-
86
SqDic = {}
97
SqDic['T2-TSE-TRA'] = 't2tra'
108
SqDic['T2-TRA'] = 't2tra'
@@ -43,16 +41,16 @@ def main():
4341
print("Found %s patients, writing csv" % (len(datasetHierarchyDict.keys())))
4442

4543
try:
46-
with open(outputFile, 'wb') as outFile:
44+
with open(outputFile, 'w') as outFile:
4745
cw = csv.writer(outFile, lineterminator='\n')
4846
cw.writerow(['Patient', 'Sequence', 'Reader', 'Image', 'Mask'])
4947

50-
for patient, Studies in sorted(six.iteritems(datasetHierarchyDict), key=lambda t: t[0]):
51-
for Study, im_fileList in sorted(six.iteritems(Studies['reconstructions']), key=lambda t: t[0]):
48+
for patient, Studies in sorted(datasetHierarchyDict.items(), key=lambda t: t[0]):
49+
for Study, im_fileList in sorted(Studies['reconstructions'].items(), key=lambda t: t[0]):
5250
for i_idx, im_file in enumerate(im_fileList):
5351

54-
if Studies['segmentations'].has_key(Study):
55-
for Reader, seg_fileList in sorted(six.iteritems(Studies['segmentations'][Study]), key=lambda t: t[0]):
52+
if Study in Studies['segmentations']:
53+
for Reader, seg_fileList in sorted(Studies['segmentations'][Study].items(), key=lambda t: t[0]):
5654
for s_idx, seg_file in enumerate(sorted(seg_fileList)):
5755

5856
i_name = Study
@@ -75,22 +73,22 @@ def scanpatients(f, filetype):
7573
if (fname[0:3] == "Pt-") & (fname.endswith(filetype)):
7674
PtNo = fname[3:7]
7775

78-
if not outputDict.has_key(PtNo):
76+
if PtNo not in outputDict:
7977
outputDict[PtNo] = {'reconstructions': {}}
8078
outputDict[PtNo]['segmentations'] = {}
8179

82-
for SqKey, SqVal in six.iteritems(SqDic):
80+
for SqKey, SqVal in SqDic.items():
8381
if ("ROI_" + SqVal) in fname:
84-
for ReaderKey, ReaderVal in six.iteritems(LabelDic):
82+
for ReaderKey, ReaderVal in LabelDic.items():
8583
if (ReaderKey + '_') in fname:
86-
if not outputDict[PtNo]['segmentations'].has_key(SqVal):
84+
if SqVal not in outputDict[PtNo]['segmentations']:
8785
outputDict[PtNo]['segmentations'][SqVal] = {}
88-
if not outputDict[PtNo]['segmentations'][SqVal].has_key(ReaderVal):
86+
if ReaderVal not in outputDict[PtNo]['segmentations'][SqVal]:
8987
outputDict[PtNo]['segmentations'][SqVal][ReaderVal] = set()
9088
outputDict[PtNo]['segmentations'][SqVal][ReaderVal].add(os.path.join(dirpath, fname))
9189
break
9290
elif SqKey in fname:
93-
if not outputDict[PtNo]['reconstructions'].has_key(SqVal):
91+
if SqVal not in outputDict[PtNo]['reconstructions']:
9492
outputDict[PtNo]['reconstructions'][SqVal] = set()
9593
outputDict[PtNo]['reconstructions'][SqVal].add(os.path.join(dirpath, fname))
9694
break

conda/meta.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,12 @@ requirements:
2222
- pykwalify >=1.6.0
2323
- pywavelets >=0.4.0
2424
- SimpleITK !=1.1.0
25-
- six >=1.10.0
2625
run:
2726
- python
2827
- numpy >=1.9.2
2928
- pykwalify >=1.6.0
3029
- pywavelets >=0.4.0
3130
- SimpleITK !=1.1.0
32-
- six >=1.10.0
3331
- scipy
3432
- scikit-learn
3533
- trimesh

docs/developers.rst

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ Using feature classes directly
184184

185185
from radiomics import firstorder, glcm, imageoperations, shape, glrlm, glszm, getTestCase
186186
import SimpleITK as sitk
187-
import six
188187
import sys, os
189188

190189
* Set up a data directory variable::
@@ -204,7 +203,7 @@ Using feature classes directly
204203
firstOrderFeatures = firstorder.RadiomicsFirstOrder(image,mask)
205204
firstOrderFeatures.enableAllFeatures() # On the feature class level, all features are disabled by default.
206205
firstOrderFeatures.calculateFeatures()
207-
for (key,val) in six.iteritems(firstOrderFeatures.featureValues):
206+
for (key,val) in firstOrderFeatures.featureValues.items():
208207
print("\t%s: %s" % (key, val))
209208

210209
* See the :ref:`radiomics-features-label` section for more features that you can calculate.

docs/index.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ and filters, thereby enabling fully reproducible feature extraction. For more in
107107
* numpy (Feature calculation)
108108
* PyWavelets (Wavelet filter)
109109
* pykwalify (Enabling yaml parameters file checking)
110-
* six (Python 3 Compatibility)
111110

112111
See also the `requirements file <https://github.com/Radiomics/pyradiomics/blob/master/requirements.txt>`_.
113112

docs/usage.rst

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ Interactive Use
127127
import os
128128

129129
import SimpleITK as sitk
130-
import six
131130

132131
from radiomics import featureextractor, getTestCase
133132

@@ -152,13 +151,13 @@ Interactive Use
152151
* Calculate the features (segment-based)::
153152

154153
result = extractor.execute(imageName, maskName)
155-
for key, val in six.iteritems(result):
154+
for key, val in result.items():
156155
print("\t%s: %s" %(key, val))
157156

158157
* Calculate the features (voxel-based)::
159158

160159
result = extractor.execute(imageName, maskName, voxelBased=True)
161-
for key, val in six.iteritems(result):
160+
for key, val in result.items():
162161
if isinstance(val, sitk.Image): # Feature map
163162
sitk.WriteImage(val, key + '.nrrd', True)
164163
print("Stored feature %s in %s" % (key, key + ".nrrd"))

examples/helloFeatureClass.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import numpy
66
import SimpleITK as sitk
7-
import six
87

98
from radiomics import firstorder, getTestCase, glcm, glrlm, glszm, imageoperations, shape
109

@@ -65,7 +64,7 @@
6564
print('done')
6665

6766
print('Calculated first order features: ')
68-
for (key, val) in six.iteritems(results):
67+
for (key, val) in results.items():
6968
print(' ', key, ':', val)
7069

7170
#
@@ -84,7 +83,7 @@
8483
print('done')
8584

8685
print('Calculated Shape features: ')
87-
for (key, val) in six.iteritems(results):
86+
for (key, val) in results.items():
8887
print(' ', key, ':', val)
8988

9089
#
@@ -103,7 +102,7 @@
103102
print('done')
104103

105104
print('Calculated GLCM features: ')
106-
for (key, val) in six.iteritems(results):
105+
for (key, val) in results.items():
107106
print(' ', key, ':', val)
108107

109108
#
@@ -122,7 +121,7 @@
122121
print('done')
123122

124123
print('Calculated GLRLM features: ')
125-
for (key, val) in six.iteritems(results):
124+
for (key, val) in results.items():
126125
print(' ', key, ':', val)
127126

128127
#
@@ -141,7 +140,7 @@
141140
print('done')
142141

143142
print('Calculated GLSZM features: ')
144-
for (key, val) in six.iteritems(results):
143+
for (key, val) in results.items():
145144
print(' ', key, ':', val)
146145

147146
#
@@ -153,7 +152,7 @@
153152
logFirstorderFeatures = firstorder.RadiomicsFirstOrder(logImage, mask, **inputKwargs)
154153
logFirstorderFeatures.enableAllFeatures()
155154
results = logFirstorderFeatures.execute()
156-
for (key, val) in six.iteritems(results):
155+
for (key, val) in results.items():
157156
laplacianFeatureName = '%s_%s' % (imageTypeName, key)
158157
print(' ', laplacianFeatureName, ':', val)
159158
#
@@ -165,6 +164,6 @@
165164
waveletFirstOrderFeaturs.enableAllFeatures()
166165
results = waveletFirstOrderFeaturs.execute()
167166
print('Calculated firstorder features with wavelet ', decompositionName)
168-
for (key, val) in six.iteritems(results):
167+
for (key, val) in results.items():
169168
waveletFeatureName = '%s_%s' % (str(decompositionName), key)
170169
print(' ', waveletFeatureName, ':', val)

examples/helloRadiomicsWithSettings.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import logging
66
import os
77

8-
import six
9-
108
import radiomics
119
from radiomics import featureextractor, getFeatureClasses
1210

@@ -41,9 +39,9 @@
4139
featureClasses = getFeatureClasses()
4240

4341
print("Active features:")
44-
for cls, features in six.iteritems(extractor.enabledFeatures):
42+
for cls, features in extractor.enabledFeatures.items():
4543
if features is None or len(features) == 0:
46-
features = [f for f, deprecated in six.iteritems(featureClasses[cls].getFeatureNames()) if not deprecated]
44+
features = [f for f, deprecated in featureClasses[cls].getFeatureNames().items() if not deprecated]
4745
for f in features:
4846
print(f)
4947
print(getattr(featureClasses[cls], 'get%sFeatureValue' % f).__doc__)

0 commit comments

Comments
 (0)